爬蟲應用:
基於python的requests+lxml,lxml中有xpath語法,功能強大,定位準確
Xpath用法:
在 XPath 中,有七種類型的節點:元素、屬性、文本、命名空間、處理指令、註釋以及文檔(根)節點。XML 文檔是被作爲節點樹來對待的;
表達式 | 描述 |
nodename | 選取此節點的所有子節點 |
/ | 從根節點選取,一層一層篩選 |
// | 文檔任何位置都能找到文檔中的節點,遞歸篩選 |
. | 選取當前節點 |
.. | 選取當前節點的父節點 |
@ | 選取屬性 |
謂語:
路徑表達式 | 結果 |
//div/a[1] | 選取屬於div子元素下的a標籤的第一個 |
//div/a[last()] | 選取屬於div下子元素的a標籤的最後一個 |
//div/a[last()-1] | 選取屬於div下子元素的a標籤的倒數第二個 |
//div/a[position()<3] | 選取最前面兩個屬於div元素的子元素的a標籤 |
//div[@lang='eng'] | 屬性選取,一般有class,id,自定義屬性 |
//div/a[price>35.00] | 選取div下的a標籤的price大於35 |
選取未知節點:
* 匹配任何元素節點
@*匹配任何屬性節點
node()匹配任何類型的節點
路徑表達式 | 結果 |
---|---|
/bookstore/* | 選取 bookstore 元素的所有子元素。 |
//* | 選取文檔中的所有元素。 |
//title[@*] | 選取所有帶有屬性的 title 元素。 |
選取若干路徑
通過在路徑表達式中使用“|”運算符,您可以選取若干個路徑。
//book/title | //book/price 選取 book 元素的所有 title 和 price 元素。
//title | //price 選取文檔中的所有 title 和 price 元素。
/bookstore/book/title | //price 選取屬於 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price 元素。
三、軸
軸可定義相對於當前節點的節點集;
軸名稱 | 結果 |
---|---|
ancestor | 選取當前節點的所有先輩(父、祖父等)。 |
ancestor-or-self | 選取當前節點的所有先輩(父、祖父等)以及當前節點本身。 |
attribute | 選取當前節點的所有屬性 |
child | 選取當前節點的所有子元素 |
descendant | 選取當前節點的所有後代元素(子、孫等) |
descendant-or-self | 選取當前節點的所有後代元素(子、孫等)以及當前節點本身 |
following | 選取文檔中當前節點的結束標籤之後的所有節點 |
namespace | 選取當前節點的所有命名空間節點 |
parent | 選取當前節點的父節點 |
preceding | 選取文檔中當前節點的開始標籤之前的所有節點 |
preceding-sibling | 選取當前節點之前的所有同級節點 |
self | 選取當前節點 |
例子:
例子 | 結果 |
child::book | 選取所有屬於當前節點的子元素的 book 節點 |
attribute::lang | 選取當前節點的 lang 屬性 |
child::* | 選取當前節點的所有子元素 |
attribute::* | 選取當前節點的所有屬性 |
child::text() | 選取當前節點的所有文本子節點 |
child::node() | 選取當前節點的所有子節點 |
descendant::book | 選取當前節點的所有 book 後代 |
ancestor::book | 選擇當前節點的所有 book 先輩 |
ancestor-or-self::book | 選取當前節點的所有 book 先輩以及當前節點(如果此節點是 book 節點) |
child::*/child::price | 選取當前節點的所有 price 孫節點 |
四、一些函數
1. starts-with函數
獲取以xxx開頭的元素
例子:xpath(‘//div[stars-with(@class,”test”)]’)
2 contains函數
獲取包含xxx的元素
例子:xpath(‘//div[contains(@id,”test”)]’)
3 and
與的關係
例子:xpath(‘//div[contains(@id,”test”) and contains(@id,”title”)]’)
4 text()函數
例子1:xpath(‘//div[contains(text(),”test”)]’)
例子2:xpath(‘//div[@id=”“test]/text()’)