應(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):
- 通過lxml"格式化"html文檔后,進(jìn)行xpath選擇,不管有沒有選擇到元素,所得到的都是一個(gè)列表(哪怕選擇的就直接是標(biāo)簽內(nèi)的文本值,返回的都是列表)
- 如果選擇的是標(biāo)簽,返回的列表就是標(biāo)簽所對應(yīng)的地址對象;如果是文本(如標(biāo)簽內(nèi)的值,或?qū)傩灾?,返回的就是文本值的列表
- 除非很有把握,不然就多try......except IndexError.......
具體應(yīng)用中需要多注意的技巧:
- chrome瀏覽器中有一個(gè)擴(kuò)展,叫Xpath Helper,能很好的進(jìn)行xpath語法校驗(yàn),并高亮標(biāo)記被選的標(biāo)簽(前提是語法正確并確實(shí)有這個(gè)元素)
- nodename//*/text(),獲取nodename節(jié)點(diǎn)下所有節(jié)點(diǎn)的文本內(nèi)容,不管深度
- nodename[text()='特定文本'],選取節(jié)點(diǎn)文本內(nèi)容是"特定文本"的所有nodename節(jié)點(diǎn)
- nodename/following-sibling::div[1], 選取nodename后面的同級節(jié)點(diǎn)中的第一個(gè)div標(biāo)簽
- 在瀏覽器或者插件中行的通的xpath表達(dá)式不一定在爬蟲行的通(一般來說是都可行的,但是小編也遇到過這種行不通的),這個(gè)時(shí)候,建議下載需要爬取的頁面html文件,仔細(xì)的確定下html文檔結(jié)構(gòu),再構(gòu)建xpath表達(dá)式(有很多html文件結(jié)構(gòu)是很雜亂的,而瀏覽器是可以'修飾'HTML文件的)
相關(guān)文檔
- w3school中xpath教程:http://www.w3school.com.cn/xpath/xpath_intro.asp
- xpath中l(wèi)xml官方文檔: https://pythonguidecn.readthedocs.io/zh/latest/scenarios/scrape.html#id1