XPath
XPath 是一門在XML文檔中查找信息的語言,被用于在XML文檔中通過元素和屬性進(jìn)行導(dǎo)航。不夠它也可以在HTML文檔中工作,并且大部分瀏覽器也支持通過XPath來查詢節(jié)點(diǎn)。
在python爬蟲開發(fā)中,經(jīng)常使用XPath查找提取網(wǎng)頁中的信息,因此XPath非常重要。
1.XPath節(jié)點(diǎn)
在XPath中,XML文檔是被作為節(jié)點(diǎn)樹來對(duì)待的,有七種類型的節(jié)點(diǎn):元素、屬性、文件、命名空間、處理指令、注釋以及文檔節(jié)點(diǎn)。
樹的根被稱為文檔節(jié)點(diǎn)或者根節(jié)點(diǎn)。
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é)點(diǎn)例子包括:<classroom>(文檔節(jié)點(diǎn))、 <id>1001</id>(元素節(jié)點(diǎn))、lang="en"(屬性節(jié)點(diǎn))、marry(文本)。
2. XPath語法
XPath使用路徑表達(dá)式來選取XML文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集。節(jié)點(diǎn)是沿著path或者step來選取的。
-
路徑表達(dá)式
表達(dá)式 描述 nodename 選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn) / 從根結(jié)點(diǎn)選取 // 選擇任意位置的某個(gè)節(jié)點(diǎn) . 選擇當(dāng)前節(jié)點(diǎn) .. 選擇當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) @ 選取屬性 -
選取某個(gè)特定的節(jié)點(diǎn)或者包含某一個(gè)指定的值的節(jié)點(diǎn),有時(shí)需要用到謂語。
實(shí)現(xiàn)效果 路徑表達(dá)式 選取屬于classroom子元素的第一個(gè)student元素 /classroom/student[1] 選取屬于classroom子元素的最后一個(gè)student元素 /classroom/student[last()] 選取屬于classroom子元素的倒數(shù)第二個(gè)student元素 /classroom/student[last()-1] 選取最前面的兩個(gè)屬于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 -
實(shí)現(xiàn)效果 路徑表達(dá)式 選取所有帶有屬性的name元素 //name[@*] 選取student元素的所有name和age元素 //student/name | //student/age XPath在進(jìn)行節(jié)點(diǎn)選取的時(shí)候可以使用通配符"*"匹配未知的元素,同時(shí)使用操作符"|"一次選取多條路徑。
實(shí)現(xiàn)效果 路徑表達(dá)式 選取所有帶有屬性的name元素 //name[@*] 選取student元素的所有name和age元素 //student/name | //student/age
3. XPath軸
軸定義了所選節(jié)點(diǎn)與當(dāng)前節(jié)點(diǎn)之間的樹關(guān)系。
位置路徑均包括一個(gè)或多個(gè)步,每個(gè)步均被斜杠分割:/step/step...(絕對(duì)位置路徑),step/step/...(相對(duì)位置路徑)
步(step)包括:軸(axis)、節(jié)點(diǎn)測試(node-test)、零個(gè)或者更多謂語(predicate),用來更深入地提煉所選的節(jié)點(diǎn)集。
-
軸名稱 含義 child 選取當(dāng)前節(jié)點(diǎn)的所有子元素 parent 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) ancestor 選取當(dāng)前結(jié)點(diǎn)的所有先輩 ancestor-or-self 選取當(dāng)前節(jié)點(diǎn)的所有先輩及當(dāng)前節(jié)點(diǎn)本身 descendant 選取當(dāng)前結(jié)點(diǎn)的所有后代元素 descentdant-or-self 選取當(dāng)前結(jié)點(diǎn)的所有后代元素及當(dāng)前節(jié)點(diǎn)本身 preceding 選取當(dāng)前節(jié)點(diǎn)的開始標(biāo)記之前的所有節(jié)點(diǎn) following 選取當(dāng)前節(jié)點(diǎn)的結(jié)束標(biāo)記之后的所有節(jié)點(diǎn) preceding-sibling 選取當(dāng)前節(jié)點(diǎn)之前的所有同級(jí)節(jié)點(diǎn) following-sibling 選取當(dāng)前節(jié)點(diǎn)之后的所有同級(jí)節(jié)點(diǎn) self 選取當(dāng)前節(jié)點(diǎn) attribute 選取當(dāng)前結(jié)點(diǎn)的所有屬性 namespace 選取當(dāng)前節(jié)點(diǎn)的所有命名空間節(jié)點(diǎn) XPath軸:
軸名稱 含義 child 選取當(dāng)前節(jié)點(diǎn)的所有子元素 parent 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) ancestor 選取當(dāng)前結(jié)點(diǎn)的所有先輩 ancestor-or-self 選取當(dāng)前節(jié)點(diǎn)的所有先輩及當(dāng)前節(jié)點(diǎn)本身 descendant 選取當(dāng)前結(jié)點(diǎn)的所有后代元素 descentdant-or-self 選取當(dāng)前結(jié)點(diǎn)的所有后代元素及當(dāng)前節(jié)點(diǎn)本身 preceding 選取當(dāng)前節(jié)點(diǎn)的開始標(biāo)記之前的所有節(jié)點(diǎn) following 選取當(dāng)前節(jié)點(diǎn)的結(jié)束標(biāo)記之后的所有節(jié)點(diǎn) preceding-sibling 選取當(dāng)前節(jié)點(diǎn)之前的所有同級(jí)節(jié)點(diǎn) following-sibling 選取當(dāng)前節(jié)點(diǎn)之后的所有同級(jí)節(jié)點(diǎn) self 選取當(dāng)前節(jié)點(diǎn) attribute 選取當(dāng)前結(jié)點(diǎn)的所有屬性 namespace 選取當(dāng)前節(jié)點(diǎn)的所有命名空間節(jié)點(diǎn) E.g. 選取所有id節(jié)點(diǎn)的父節(jié)點(diǎn):
//id/parent::*
- 參考:《Python爬蟲開發(fā)與項(xiàng)目實(shí)踐》