xpath使用

應(yīng)用場景:

選取HTML中特定節(jié)點(diǎn),以期獲取特定的文本值!對于小編來說,多用于爬蟲制作過程中需要頁面解析的部分
注:xpath本身功能非常強(qiáng)大,但對于一個(gè)爬蟲來說,主要的就是定位節(jié)點(diǎn)和獲取屬性或文本值這些基礎(chǔ)功能,而小編在接下來的講解中也只涉及這些內(nèi)容@_@)

簡單介紹:

在w3school介紹中,xpath是在xml中進(jìn)行導(dǎo)航的工具,憑借的就是xml的這種非常結(jié)構(gòu)化的結(jié)構(gòu),所以在HTML中也是可以用xpath進(jìn)行元素節(jié)點(diǎn)的獲取!


使用之前需要做什么:

分兩類:

1. 對xpath進(jìn)行原生支持的工具,則只要會(huì)xpath表達(dá)式就行:

如Python中導(dǎo)入selenium模塊,初始化得到一個(gè)driver對象后,憑借其本身方法就行:

driver.find_element_by_xpath("xpath表達(dá)式")

2. 其余的日常使用:

結(jié)合lxml模塊(小編用的是Python語言)

from lxml import html

html_text = """
<html>
<head>
<title>HTML文本</title>
</head>
<body>
<div>
<p>
xpath筆記-爬蟲篇
</p>
</div>
</body>
</html>
"""
tree = html.fromstring(html_text)  # 將html_text這個(gè)HTML文件轉(zhuǎn)換成一個(gè)'樹'結(jié)構(gòu),存入tree中
target = tree.xpath("http://body/div/p/text()")[0]  # 獲取html_text這個(gè)html文件中的p標(biāo)簽的文本內(nèi)容'xpath筆記-爬蟲篇'

xpath表達(dá)式語法:

1. 基本概念和語法:

我不想照抄其他人的文本和概念,所以,詳情請參考:
http://www.w3school.com.cn/xpath/xpath_nodes.asp

2. 對謂語, 步, 和軸的理解

  • 什么是謂語?
    謂語是對主語的動(dòng)作或狀態(tài)的陳述或者說明.具體到這里,就是對選擇的節(jié)點(diǎn)要進(jìn)一步做什么來進(jìn)行說明,說白了就是判斷的條件!需要注意的是,謂語必須在中括號(hào)[] 里面
tree.xpath("http://div[3]")  ## 選取整個(gè)html文檔中遇到的第三個(gè)div(上面的示例中沒有)
  • 什么是步?
    在xpath中兩個(gè)正斜杠"/"之間就可以認(rèn)為是一'步',可以這樣想:從html這個(gè)節(jié)點(diǎn),深入一"步",到下一個(gè)div節(jié)點(diǎn) @_@
  • 什么是軸?
    首先需要說明的是,軸是包含在步里面的
    軸就是從選定的某個(gè)節(jié)點(diǎn)開始,拓展節(jié)點(diǎn)選擇的范圍,軸就是節(jié)點(diǎn)的一個(gè)范圍,也就是w3school中說的節(jié)點(diǎn)集,舉個(gè)例子:
tree.xpath("http://html/div[1]")  # 第一句
tree.xpath("http://html/div[1]/child::p")  # 第二句

上面代碼中,第一句的代碼只是選擇到html中遇到的第一個(gè)div;
而第二句中,就多了一個(gè)軸,叫child,代表上個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn),所以就選擇的是第一個(gè)div所有子元素中的標(biāo)簽名為p的節(jié)點(diǎn)(看,這個(gè)節(jié)點(diǎn)的范圍是不是被"拓展"了,雖然不知道這個(gè)p標(biāo)簽在現(xiàn)實(shí)情況中有多少個(gè),但在邏輯上是"很多個(gè)", >_<)

具體應(yīng)用中需要多注意的事項(xiàng):

  1. 通過lxml"格式化"html文檔后,進(jìn)行xpath選擇,不管有沒有選擇到元素,所得到的都是一個(gè)列表(哪怕選擇的就直接是標(biāo)簽內(nèi)的文本值,返回的都是列表)
  2. 如果選擇的是標(biāo)簽,返回的列表就是標(biāo)簽所對應(yīng)的地址對象;如果是文本(如標(biāo)簽內(nèi)的值,或?qū)傩灾?,返回的就是文本值的列表
  3. 除非很有把握,不然就多try......except IndexError.......

具體應(yīng)用中需要多注意的技巧:

  1. chrome瀏覽器中有一個(gè)擴(kuò)展,叫Xpath Helper,能很好的進(jìn)行xpath語法校驗(yàn),并高亮標(biāo)記被選的標(biāo)簽(前提是語法正確并確實(shí)有這個(gè)元素)
  2. nodename//*/text(),獲取nodename節(jié)點(diǎn)下所有節(jié)點(diǎn)的文本內(nèi)容,不管深度
  3. nodename[text()='特定文本'],選取節(jié)點(diǎn)文本內(nèi)容是"特定文本"的所有nodename節(jié)點(diǎn)
  4. nodename/following-sibling::div[1], 選取nodename后面的同級節(jié)點(diǎn)中的第一個(gè)div標(biāo)簽
  5. 在瀏覽器或者插件中行的通的xpath表達(dá)式不一定在爬蟲行的通(一般來說是都可行的,但是小編也遇到過這種行不通的),這個(gè)時(shí)候,建議下載需要爬取的頁面html文件,仔細(xì)的確定下html文檔結(jié)構(gòu),再構(gòu)建xpath表達(dá)式(有很多html文件結(jié)構(gòu)是很雜亂的,而瀏覽器是可以'修飾'HTML文件的)

相關(guān)文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容