1. 程式人生 > 其它 >爬蟲與Python:(三)基本庫的使用——6.XPath——XML中查詢資訊的語言

爬蟲與Python:(三)基本庫的使用——6.XPath——XML中查詢資訊的語言

Path是一門在XML文件中查資訊的語言,XPath可用來XML文件中對元素和屬性進行遍歷。XPath是W3C XSLT 標準的主元素,並且XQuery和Xpointer都構建於XPath表達上。XPath在Python的爬蟲學習中,起著舉足輕重的作用,對比正則表示式re,兩者可以完成同樣的工作,實現功能頁類似,但XPath比re具有明顯的優勢。

XPath,全稱 XML Path Language, 是一種小型語言查詢語言,有一下優點:

  1. 可在XML中查詢資訊。
  2. 支援HTML查詢
  3. 可通過元素和屬性進行導航。

Python開發使用XPath條件:由於XPath屬於lxml庫。Inc,需要先安裝lxml庫,安裝步驟請參考:

https://www.cnblogs.com/luyj00436/p/15415280.html

輸入安裝的pip命令為:

 pip install lxml

本文的主要內容包括:

  1. XPaht的使用方法
  2. 利用示例講解XPath的使用
  3. 獲取所有節點
  4. 獲取子節點
  5. 獲取文字資訊

1. XPath的使用方法

下面介紹一下XPaht的基礎語法知識,常見的使用方法主要有以下幾種:

  1. // (雙斜槓):定位根節點,會對全文進行掃描,在文件中選取所有符合條件的內容,以列表的形式返回。
  2. /(單斜杆) : 尋找當前標籤路徑的下一層路徑標籤或對當前路徑標籤內容進行操作。
  3. /text() :獲取當前路徑下的文字內容。
  4. /@xxxx : 獲取當前路徑下標籤的屬性值。
  5. |(可選符) : 使用“|”可選取若干路徑,如//p | div,即當前路徑下選取的所有符合條件的P標籤和div標籤。
  6. .(點):用來選取當前節點。
  7. ..(雙點):選取當前節點的父節點。

2. 利用示例講解XPath的使用

以下是一段HTML程式碼:

1 <div>
2     <ul>
3         <li class="item-0"><a href="www.baidu.com"></a></li>
4         <li class="item-1"><a href="https://www.cnblogs.com/luyj00436"
>myblog</a></li> 5 <li class="item-2"><a href="https://www.csdn.net/">csdn</a></li> 6 <li class="item-3"><a href="https://www.hao123.com/">hao123</a></li>

顯然,這段HTML程式碼沒有閉合,因此可以使用lxml中的etree模組進行補全,示例程式碼入如下:

 1 from lxml import etree
 2 
 3 text = '''
 4 <div>
 5     <ul>
 6         <li class="item-0"><a href="www.baidu.com"></a></li>
 7         <li class="item-1"><a href="https://www.cnblogs.com/luyj00436">myblog</a></li>
 8         <li class="item-2"><a href="https://www.csdn.net/">csdn</a></li>
 9         <li class="item-3"><a href="https://www.hao123.com/">hao123</a></li>
10         '''
11 html = etree.HTML(text)
12 result = etree.tostring(html)
13 print(result.decode("UTF-8"))

執行後控制檯會輸出:

可以看到,etree不僅閉合了節點,還添加了其他需要的標籤。除了直接讀取文字進行解析外,etree還可以讀取檔案進行解析,示例程式碼如下:

1 from lxml import etree
2 
3 html = etree.parse('./test.html',etree.HTMLParser())
4 result = etree.tostring(html)
5 print(result.decode("UTF-8"))

3. 獲取所有節點

根據XPath常用規則可知,通過“//”可以查詢當前節點的子孫節點,以上面的HTML為例獲取所有的節點,示例程式碼如下:

1 from lxml import etree
2 
3 html = etree.parse('./test.html',etree.HTMLParser())
4 result = html.xpath('//*') # 表示獲取當前節點的子孫的節點,*表示所有節點,
5                             # //* 表示獲取當前節點下的所有節點
6 for item in  result:
7     print(item)

注:如果不是獲取所有節點而是指定獲取某個節點,只需要將“*”改為指定節點名稱即可,如獲取所有的節點。這個HTMLdiam可以直接放在程式碼變數中,也可以放在檔案中,效果一致。

4. 獲取子節點

根據XPath的常用規則可知,通過“/”或“//”可以獲取子孫結點或子節點。

“//”表示選擇的所有節點,‘/’表示選擇的直接節點。

示例程式碼如下:

1 from lxml import etree
2 
3 html = etree.parse('./test.html',etree.HTMLParser())
4 result = html.xpath('//ul//a')  # 先選擇所有ul節點,再選擇ul節點下的所有a節點。包含元素。
5 result = html.xpath('//ul/a')   # 先選擇所有ul節點,再選擇ul節點下的直接子節點a,不包含元素
6 result = html.xpath('//li/a')   # 先選擇所有li節點,再選擇ul節點下的直接子節點a,包含元素

5. 獲取文字資訊

大多數時候,找到指定節點都是要獲取節點的文字資訊。這裡使用text()方法獲取節點的文字。獲取所有的a標籤文字資訊,示例程式碼如下。

1 from lxml import etree
2 
3 html = etree.parse('./test.html',etree.HTMLParser())
4 result = html.xpath('//ul//a/text()')
5 print(result)

有興趣可以去W3School官網檢視XPath教程。

有志者,事竟成,破釜沉舟,百二秦關終屬楚; 苦心人,天不負,臥薪嚐膽,三千越甲可吞吳。