《Python爬蟲開發(fā)與項(xiàng)目實(shí)踐》讀書筆記——XPath

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í)踐》
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容