Xpath語法學習

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
相關文章
相關標籤/搜索