XPath
XPath 是一門在XML文檔中查找信息的語言帅容,被用于在XML文檔中通過元素和屬性進(jìn)行導(dǎo)航髓绽。不夠它也可以在HTML文檔中工作突那,并且大部分瀏覽器也支持通過XPath來查詢節(jié)點暑诸。
在python爬蟲開發(fā)中,經(jīng)常使用XPath查找提取網(wǎng)頁中的信息东羹,因此XPath非常重要。
1.XPath節(jié)點
在XPath中弱睦,XML文檔是被作為節(jié)點樹來對待的百姓,有七種類型的節(jié)點:元素渊额、屬性况木、文件、命名空間旬迹、處理指令火惊、注釋以及文檔節(jié)點。
樹的根被稱為文檔節(jié)點或者根節(jié)點奔垦。
E.g.:
<?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>
</classroom>
- 上面的XML文檔中的節(jié)點例子包括:<classroom>(文檔節(jié)點)屹耐、 <id>1001</id>(元素節(jié)點)、lang="en"(屬性節(jié)點)椿猎、marry(文本)惶岭。
2. XPath語法
XPath使用路徑表達(dá)式來選取XML文檔中的節(jié)點或節(jié)點集。節(jié)點是沿著path或者step來選取的犯眠。
-
路徑表達(dá)式
表達(dá)式 描述 nodename 選取此節(jié)點的所有子節(jié)點 / 從根結(jié)點選取 // 選擇任意位置的某個節(jié)點 . 選擇當(dāng)前節(jié)點 .. 選擇當(dāng)前節(jié)點的父節(jié)點 @ 選取屬性 -
選取某個特定的節(jié)點或者包含某一個指定的值的節(jié)點按灶,有時需要用到謂語。
實現(xiàn)效果 路徑表達(dá)式 選取屬于classroom子元素的第一個student元素 /classroom/student[1] 選取屬于classroom子元素的最后一個student元素 /classroom/student[last()] 選取屬于classroom子元素的倒數(shù)第二個student元素 /classroom/student[last()-1] 選取最前面的兩個屬于classroom元素的子元素的student元素 /classroom/student[positon()<3] 選取所有擁有名為lang的屬性的name元素 //name[@lang] 選取所有name元素筐咧,且這些元素?fù)碛兄禐閑ng的lang屬性 //name[@lang='en'] 選取classroom元素的所有student元素鸯旁,且其中的age元素的值必須大于20 /classroom/student[age>20] 選取classroom元素中的student元素的所有name元素,且其中的age元素的值必須大于20 /classroom/student[age>20]/name -
實現(xiàn)效果 路徑表達(dá)式 選取所有帶有屬性的name元素 //name[@*] 選取student元素的所有name和age元素 //student/name | //student/age XPath在進(jìn)行節(jié)點選取的時候可以使用通配符"*"匹配未知的元素量蕊,同時使用操作符"|"一次選取多條路徑铺罢。
實現(xiàn)效果 路徑表達(dá)式 選取所有帶有屬性的name元素 //name[@*] 選取student元素的所有name和age元素 //student/name | //student/age
3. XPath軸
軸定義了所選節(jié)點與當(dāng)前節(jié)點之間的樹關(guān)系。
位置路徑均包括一個或多個步残炮,每個步均被斜杠分割:/step/step...(絕對位置路徑)韭赘,step/step/...(相對位置路徑)
步(step)包括:軸(axis)、節(jié)點測試(node-test)势就、零個或者更多謂語(predicate)辞居,用來更深入地提煉所選的節(jié)點集。
-
軸名稱 含義 child 選取當(dāng)前節(jié)點的所有子元素 parent 選取當(dāng)前節(jié)點的父節(jié)點 ancestor 選取當(dāng)前結(jié)點的所有先輩 ancestor-or-self 選取當(dāng)前節(jié)點的所有先輩及當(dāng)前節(jié)點本身 descendant 選取當(dāng)前結(jié)點的所有后代元素 descentdant-or-self 選取當(dāng)前結(jié)點的所有后代元素及當(dāng)前節(jié)點本身 preceding 選取當(dāng)前節(jié)點的開始標(biāo)記之前的所有節(jié)點 following 選取當(dāng)前節(jié)點的結(jié)束標(biāo)記之后的所有節(jié)點 preceding-sibling 選取當(dāng)前節(jié)點之前的所有同級節(jié)點 following-sibling 選取當(dāng)前節(jié)點之后的所有同級節(jié)點 self 選取當(dāng)前節(jié)點 attribute 選取當(dāng)前結(jié)點的所有屬性 namespace 選取當(dāng)前節(jié)點的所有命名空間節(jié)點 XPath軸:
軸名稱 含義 child 選取當(dāng)前節(jié)點的所有子元素 parent 選取當(dāng)前節(jié)點的父節(jié)點 ancestor 選取當(dāng)前結(jié)點的所有先輩 ancestor-or-self 選取當(dāng)前節(jié)點的所有先輩及當(dāng)前節(jié)點本身 descendant 選取當(dāng)前結(jié)點的所有后代元素 descentdant-or-self 選取當(dāng)前結(jié)點的所有后代元素及當(dāng)前節(jié)點本身 preceding 選取當(dāng)前節(jié)點的開始標(biāo)記之前的所有節(jié)點 following 選取當(dāng)前節(jié)點的結(jié)束標(biāo)記之后的所有節(jié)點 preceding-sibling 選取當(dāng)前節(jié)點之前的所有同級節(jié)點 following-sibling 選取當(dāng)前節(jié)點之后的所有同級節(jié)點 self 選取當(dāng)前節(jié)點 attribute 選取當(dāng)前結(jié)點的所有屬性 namespace 選取當(dāng)前節(jié)點的所有命名空間節(jié)點 E.g. 選取所有id節(jié)點的父節(jié)點:
//id/parent::*
- 參考:《Python爬蟲開發(fā)與項目實踐》