XPath是一門在XML文檔中查找信息的語言,被用於在XML文檔中經過元素和屬性進行導航。XPath雖然是被設計用來搜尋XML文檔,不過它也能很好地在HTML文檔中工做,而且大部分瀏覽器也支持經過XPath來查詢節點。在Python爬蟲開發中,常常使用XPath查找提取網頁中的信息,所以XPath很是重要,支持Xpath語法的模板有lxml、scrapy。html
文檔示例:node
<? xml version="1.0" encoding="ISO-8859-1"? > <classroom> <student> <id>1001</id> <name lang="en">marry</name> <age>20</age> <country>China</country> </student> <student> <id>1002</id> <name lang="en">jack</name> <age>25</age> <country>USA</country> </student> </classroom>
一、路徑表達式瀏覽器
表達式 | 用途 |
nodename | 選取此節點的全部子節點 |
/ | 從根節點選取 |
// | 選擇任意位置的某個節點 |
. | 選取當前節點 |
.. | 選取當前節點的父節點 |
@ | 選取屬性 |
二、節點選取示例scrapy
實現效果 | 路徑表達式 |
選取classroom元素的全部子節點 | classroom |
選取根元素classroom | /classroom |
選取屬於classroom的子元素的全部student元素 | classroom/student |
選取全部student子元素,而無論它們在文檔中的位置 | //student |
選擇屬於classroom元素的後代的全部student元素,而無論它們位於classroom之下的什麼位置 | classroom//student |
選取名爲lang的全部屬性 | //@lang |
三、謂語示例spa
實現效果 | 路徑表達式 |
選取屬於classroom子元素的第一個student元素 | /classroom/student[1] |
選取屬於classroom子元素的最後一個student元素 | /classroom/student[last()] |
選取屬於classroom子元素的倒數第二個student元素 | /classroom/student[last()-1] |
選取最前面的兩個屬於classroom元素的子元素的student元素 | /classroom/student[position()<3] |
選取全部擁有名爲lang的屬性的name元素 | //name[@lang] |
選取全部name元素,且這些元素擁有值爲en的lang屬性 | //name[@lang='en'] |
選取classroom元素的全部student元素,且其中的age元素的值須大於20 | /classroom/student[age>20] |
選取classroom元素中的student元素的全部name元素,且其中的age元素的值須大於20 | /classroom/student[age>20]/name |
四、通配符* 與 | 操做符ssr
實現效果 | 路徑表達式 |
選取classroom元素的全部子元素 | /classroom/* |
選取文檔中的全部元素 | //* |
選取全部帶屬性的name元素 | //name[@*] |
選取student元素的全部name和age元素 | //student/name | //student/age |
選取屬於classroom元素的student元素的全部name元素,以及文檔中全部的age元素 | /classroom/student/name | //age |
五、Xpath軸設計
軸名稱 | 含義 |
child | 選取當前節點的全部元素 |
parent | 選取當前節點的父節點 |
ancestor | 選取當前節點的全部先輩(父、祖父等) |
ansestor-or-self | 選取當前節點的全部先輩(父、祖父等)以及當前節點自己 |
descendant | 選取當前節點的全部後代元素(子、孫等) |
descendant-or-self | 選取當前節點的全部後代元素(子、孫等)以及當前節點自己 |
preceding | 選取文檔中當前節點的開始標記以前的全部節點 |
following | 選取文檔中當前節點的結束標記以後的全部節點 |
preceding-sibling | 選取當前節點以前的全部同級節點 |
following-sibling | 選取當前節點以後的全部同級節點 |
self | 選取當前節點 |
attribute | 選取當前節點的全部屬性 |
namespace | 選取當前節點的全部命令空間節點 |
文檔示例: xml
<? xml version="1.0" encoding="ISO-8859-1"? > <classroom> <student> <id>1001</id> <name lang="en">marry</name> <age>20</age> <country>China</country> </student> <student> <id>1002</id> <name lang="en">jack</name> <age>25</age> <country>USA</country> </student> <teacher> <classid>1</classid> <name lang="en">tom</name> <age>50</age> <country>USA</country> </teacher> </classroom>
六、Xpath軸示例分析htm
實現效果 | 路徑表達式 |
選取當前classroom節點中子元素的teacher節點 | /classroom/child::teacher |
選取全部id節點的父節點 | //id/parent::* |
選取全部以classid爲子節點的祖先節點 | //classid/ancestor::* |
選取classroom節點下全部後代節點 | /classroom/descendant::* |
選取全部以student爲父節點的id元素 | //student/descendant::id |
選取全部classid元素的祖先節點及自己 | //classid/ancestor-or-self::* |
選擇/classroom/student自己及全部後代元素 | /classroom/student/descendant-or-self::* |
選取/classroom/teacher以前的全部同級節點,結果就是選擇了全部student節點 | /classroom/teacher/preceding-sibling::* |
選取/classroom中第二個student以後的同級節點,結果就是選擇了teacher節點 | /classroom/student[2]/following-sibling::* |
選取/classroom/teacher/節點全部以前的節點(除其祖先外),不單單是student節點,還有裏面的子節點 | /classroom/teacher/preceding::* |
選取classroom中第二個student以後的全部節點,結果就是選擇了teacher節點及其子節點 | /classroom/student[2]/following::* |
選取student節點,單獨使用沒有什麼意思。主要是跟其它軸一塊兒用,如ancestor-of-self,descendant-or-self | //student/self::* |
選取/classroom/teacher/name節點下的全部屬性 | /classroom/teacher/name/attribute::* |
七、運算符blog
運算符 | 描述 | 實例 | 含義 |
| | 計算兩個節點集 | //student/name | //student/age | 選取student元素的全部name和age元素 |
+ | 加法 | /classroom/student[age=19+1] | 選取classroom元素的全部student元素,且其中的age元素的值須等於20 |
- | 減法 | /classroom/student[age=21-1] | 同上 |
* | 乘法 | /classroom/student[age=4*5] | 同上 |
div | 除法 | /classroom/student[age=40 div 2] | 同上 |
= | 等於 | /classroom/student[age=20] | 同上 |
!= | 不等於 | /classroom/student[age!=20] | 選取student元素的全部name和age元素,且其中的age元素的值不等於20 |
< | 小於 | /classroom/student[age<20] | 選取student元素的全部name和age元素,且其中的age元素的值小於20 |
<= | 小於等於 | /classroom/student[age<=20] | 選取student元素的全部name和age元素,且其中的age元素的值小於等於20 |
> | 大於 | /classroom/student[age>20] | 選取student元素的全部name和age元素,且其中的age元素的值大於20 |
>= | 大於等於 | /classroom/student[age>=20] | 選取student元素的全部name和age元素,且其中的age元素的值大於等於20 |
or | 或 | /classroom/student[age<20 or age>25] | 選取student元素的全部name和age元素,且其中的age元素的值須小於20,或者大於25 |
and | 與 | /classroom/student[age>20 and age<25] | 選取student元素的全部name和age元素,且其中的age元素的值須大於20,或者小於25 |
mod | 計算除法的餘數 | 5 mod 2 | 1 |