應用場景:
選取HTML中特定節點,以期獲取特定的文本值!對于小編來說,多用于爬蟲制作過程中需要頁面解析的部分
注:xpath本身功能非常強大,但對于一個爬蟲來說,主要的就是定位節點和獲取屬性或文本值這些基礎功能,而小編在接下來的講解中也只涉及這些內容@_@)
簡單介紹:
在w3school介紹中,xpath是在xml中進行導航的工具,憑借的就是xml的這種非常結構化的結構,所以在HTML中也是可以用xpath進行元素節點的獲取!
使用之前需要做什么:
分兩類:
1. 對xpath進行原生支持的工具,則只要會xpath表達式就行:
如Python中導入selenium模塊,初始化得到一個driver對象后,憑借其本身方法就行:
driver.find_element_by_xpath("xpath表達式")
2. 其余的日常使用:
結合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這個HTML文件轉換成一個'樹'結構,存入tree中
target = tree.xpath("http://body/div/p/text()")[0] # 獲取html_text這個html文件中的p標簽的文本內容'xpath筆記-爬蟲篇'
xpath表達式語法:
1. 基本概念和語法:
我不想照抄其他人的文本和概念,所以,詳情請參考:
http://www.w3school.com.cn/xpath/xpath_nodes.asp
2. 對謂語, 步, 和軸的理解
- 什么是謂語?
謂語是對主語的動作或狀態的陳述或者說明.具體到這里,就是對選擇的節點要進一步做什么來進行說明,說白了就是判斷的條件!需要注意的是,謂語必須在中括號[] 里面
tree.xpath("http://div[3]") ## 選取整個html文檔中遇到的第三個div(上面的示例中沒有)
- 什么是步?
在xpath中兩個正斜杠"/"之間就可以認為是一'步',可以這樣想:從html這個節點,深入一"步",到下一個div節點 @_@ - 什么是軸?
首先需要說明的是,軸是包含在步里面的
軸就是從選定的某個節點開始,拓展節點選擇的范圍,軸就是節點的一個范圍,也就是w3school中說的節點集,舉個例子:
tree.xpath("http://html/div[1]") # 第一句
tree.xpath("http://html/div[1]/child::p") # 第二句
上面代碼中,第一句的代碼只是選擇到html中遇到的第一個div;
而第二句中,就多了一個軸,叫child,代表上個節點的所有子節點,所以就選擇的是第一個div所有子元素中的標簽名為p的節點(看,這個節點的范圍是不是被"拓展"了,雖然不知道這個p標簽在現實情況中有多少個,但在邏輯上是"很多個", >_<)
具體應用中需要多注意的事項:
- 通過lxml"格式化"html文檔后,進行xpath選擇,不管有沒有選擇到元素,所得到的都是一個列表(哪怕選擇的就直接是標簽內的文本值,返回的都是列表)
- 如果選擇的是標簽,返回的列表就是標簽所對應的地址對象;如果是文本(如標簽內的值,或屬性值),返回的就是文本值的列表
- 除非很有把握,不然就多try......except IndexError.......
具體應用中需要多注意的技巧:
- chrome瀏覽器中有一個擴展,叫Xpath Helper,能很好的進行xpath語法校驗,并高亮標記被選的標簽(前提是語法正確并確實有這個元素)
- nodename//*/text(),獲取nodename節點下所有節點的文本內容,不管深度
- nodename[text()='特定文本'],選取節點文本內容是"特定文本"的所有nodename節點
- nodename/following-sibling::div[1], 選取nodename后面的同級節點中的第一個div標簽
- 在瀏覽器或者插件中行的通的xpath表達式不一定在爬蟲行的通(一般來說是都可行的,但是小編也遇到過這種行不通的),這個時候,建議下載需要爬取的頁面html文件,仔細的確定下html文檔結構,再構建xpath表達式(有很多html文件結構是很雜亂的,而瀏覽器是可以'修飾'HTML文件的)
相關文檔
- w3school中xpath教程:http://www.w3school.com.cn/xpath/xpath_intro.asp
- xpath中lxml官方文檔: https://pythonguidecn.readthedocs.io/zh/latest/scenarios/scrape.html#id1