在對解析xml和html常用的解析器比較后轰胁,最后選用lxml.etree的解析方法既琴,etree.HTML()方法將獲得的網(wǎng)頁為字符串或etree.parser()方法對文本進(jìn)行樹狀結(jié)構(gòu)轉(zhuǎn)換,速度較快搜囱,且自動修復(fù)文檔結(jié)構(gòu)丑瞧。然后對結(jié)構(gòu)話的文檔用Xpath 進(jìn)行搜索、匹配犬辰、選擇……
嗦篱,
隨認(rèn)真讀一下Xpath相關(guān)文檔,并記錄如下:
文章摘錄自XPath 語法w3school
簡介
什么是 XPath?
XPath 使用路徑表達(dá)式在 XML 文檔中進(jìn)行導(dǎo)航
XPath 包含一個標(biāo)準(zhǔn)函數(shù)庫
XPath 是 XSLT 中的主要元素
XPath 是一個 W3C 標(biāo)準(zhǔn)
XPath 路徑表達(dá)式
XPath 使用路徑表達(dá)式來選取 XML 文檔中的節(jié)點(diǎn)或者節(jié)點(diǎn)集幌缝。這些路徑表達(dá)式和我們在常規(guī)的電腦文件系統(tǒng)中看到的表達(dá)式非常相似灸促。
XPath 標(biāo)準(zhǔn)函數(shù)
XPath 含有超過 100 個內(nèi)建的函數(shù)。這些函數(shù)用于字符串值涵卵、數(shù)值浴栽、日期和時間比較、節(jié)點(diǎn)和 QName 處理轿偎、序列處理典鸡、邏輯值等等。
節(jié)點(diǎn)
在 XPath 中坏晦,有七種類型的節(jié)點(diǎn):元素萝玷、屬性嫁乘、文本、命名空間球碉、處理指令蜓斧、注釋以及文檔節(jié)點(diǎn)(或稱為根節(jié)點(diǎn))。XML 文檔是被作為節(jié)點(diǎn)樹來對待的睁冬。樹的根被稱為文檔節(jié)點(diǎn)或者根節(jié)點(diǎn)挎春。
請看下面這個 XML 文檔:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
上面的XML文檔中的節(jié)點(diǎn)例子:
<bookstore> (文檔節(jié)點(diǎn))
<author>J K. Rowling</author> (元素節(jié)點(diǎn))
lang="en" (節(jié)點(diǎn)屬性)
基本值(或稱原子值,Atomic value)
基本值是無父或無子的節(jié)點(diǎn)豆拨。
基本值的例子:
J K. Rowling
"en"
項(xiàng)目(Item)
項(xiàng)目是基本值或者節(jié)點(diǎn)直奋。
節(jié)點(diǎn)關(guān)系
父(Parent)
每個元素以及屬性都有一個父。
在下面的例子中施禾,book 元素是 title脚线、author、year 以及 price 元素的父:
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
子(Children)
元素節(jié)點(diǎn)可有零個拾积、一個或多個子殉挽。
在上面的例子中,title拓巧、author斯碌、year 以及 price 元素都是 book 元素的子
同胞(Sibling)
擁有相同的父的節(jié)點(diǎn)
在下面的例子中,title肛度、author傻唾、year 以及 price 元素都是同胞
先輩(Ancestor)
某節(jié)點(diǎn)的父、父的父承耿,等等冠骄。
在下面的例子中,title 元素的先輩是 book 元素和 bookstore 元素:
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
后代(Descendant)
某個節(jié)點(diǎn)的子加袋,子的子凛辣,等等。
在下面的例子中职烧,bookstore 的后代是 book扁誓、title、author蚀之、year 以及 price 元素:
<bookstore>
<book>
<title>Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
語法
XPath 使用路徑表達(dá)式來選取 XML 文檔中的節(jié)點(diǎn)或節(jié)點(diǎn)集蝗敢。節(jié)點(diǎn)是通過沿著路徑 (path) 或者步 (steps) 來選取的。
XML 實(shí)例文檔
我們將在下面的例子中使用這個 XML 文檔足删∈偾矗‘
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
選取節(jié)點(diǎn)
XPath 使用路徑表達(dá)式在 XML 文檔中選取節(jié)點(diǎn)。節(jié)點(diǎn)是通過沿著路徑或者 step 來選取的失受。
下面列出了最有用的路徑表達(dá)式:
表達(dá)式 描述
nodename 選取此節(jié)點(diǎn)的所有子節(jié)點(diǎn)讶泰。
/ 從根節(jié)點(diǎn)選取咏瑟。
// 從匹配選擇的當(dāng)前節(jié)點(diǎn)選擇文檔中的節(jié)點(diǎn),而不考慮它們的位置痪署。
. 選取當(dāng)前節(jié)點(diǎn)响蕴。
.. 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)。
@ 選取屬性惠桃。
實(shí)例
在下面的表格中,我們已列出了一些路徑表達(dá)式以及表達(dá)式的結(jié)果
路徑表達(dá)式 | 結(jié)果 |
---|---|
bookstore | 選取 bookstore 元素的所有子節(jié)點(diǎn) |
/bookstore | 選取根元素 bookstore辖试。注釋:假如路徑起始于正斜杠( / )辜王,則此路徑始終代表到某元素的絕對路徑! |
bookstore/book | 選取屬于 bookstore 的子元素的所有 book 元素罐孝。 |
//book | 選取所有 book 子元素呐馆,而不管它們在文檔中的位置。 |
bookstore//book | 選擇屬于 bookstore 元素的后代的所有 book 元素莲兢,而不管它們位于 bookstore 之下的什么位置汹来。 |
//@lang | 選取名為 lang 的所有屬性。 |
謂語(Predicates)
謂語用來查找某個特定的節(jié)點(diǎn)或者包含某個指定的值的節(jié)點(diǎn)改艇。
謂語被嵌在方括號中收班。
實(shí)例
在下面的表格中,我們列出了帶有謂語的一些路徑表達(dá)式谒兄,以及表達(dá)式的結(jié)果:
路徑表達(dá)式 | 結(jié)果 |
---|---|
/bookstore/book[1] | 選取屬于 bookstore 子元素的第一個 book 元素摔桦。 |
/bookstore/book[last()] | 選取屬于 bookstore 子元素的最后一個 book 元素。 |
/bookstore/book[last()-1] | 選取屬于 bookstore 子元素的倒數(shù)第二個 book 元素承疲。 |
/bookstore/book[position()<3] | 選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素邻耕。 |
//title[@lang] | 選取所有擁有名為 lang 的屬性的 title 元素。 |
//title[@lang='eng'] | 選取所有 title 元素燕鸽,且這些元素?fù)碛兄禐?eng 的 lang 屬性兄世。 |
/bookstore/book[price>35.00] | 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大于 35.00啊研。 |
/bookstore/book[price>35.00]/title | 選取 bookstore 元素中的 book 元素的所有 title 元素御滩,且其中的 price 元素的值須大于 35.00蛮艰。 |
選取未知節(jié)點(diǎn)
XPath 通配符可用來選取未知的 XML 元素寿酌。
通配符 | 描述 |
---|---|
* | 匹配任何元素節(jié)點(diǎn)峻贮。 |
@* | 匹配任何屬性節(jié)點(diǎn)蚕涤。 |
node() | 匹配任何類型的節(jié)點(diǎn)峻黍。 |
選取若干路徑
通過在路徑表達(dá)式中使用“|”運(yùn)算符烂瘫,您可以選取若干個路徑扎即。
實(shí)例
在下面的表格中醒第,我們列出了一些路徑表達(dá)式花沉,以及這些表達(dá)式的結(jié)果:
路徑表達(dá)式 | 結(jié)果 |
---|---|
//book/title | //book/price | 選取 book 元素的所有 title 和 price 元素柳爽。 |
//title | //price | 選取文檔中的所有 title 和 price 元素媳握。 |
/bookstore/book/title | //price | 選取屬于 bookstore 元素的 book 元素的所有 title 元素,以及文檔中所有的 price 元素磷脯。 |
Xpath 軸
XPath Axes(軸)
XML 實(shí)例文檔
我們將在下面的例子中使用此 XML 文檔:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
XPath 軸
軸可定義相對于當(dāng)前節(jié)點(diǎn)的節(jié)點(diǎn)集蛾找。
軸名稱 | 結(jié)果 | |
---|---|---|
ancestor | 選取當(dāng)前節(jié)點(diǎn)的所有先輩(父、祖父等)赵誓。 | |
ancestor-or-self | 選取當(dāng)前節(jié)點(diǎn)的所有先輩(父打毛、祖父等) | 以及當(dāng)前節(jié)點(diǎn)本身。 |
attribute | 選取當(dāng)前節(jié)點(diǎn)的所有屬性俩功。 | |
child | 選取當(dāng)前節(jié)點(diǎn)的所有子元素幻枉。 | |
descendant | 選取當(dāng)前節(jié)點(diǎn)的所有后代元素(子、孫等)诡蜓。 | |
descendant-or-self | 選取當(dāng)前節(jié)點(diǎn)的所有后代元素(子熬甫、孫等)以及當(dāng)前節(jié)點(diǎn)本身。 | |
following | 選取文檔中當(dāng)前節(jié)點(diǎn)的結(jié)束標(biāo)簽之后的所有節(jié)點(diǎn)蔓罚。 | |
namespace | 選取當(dāng)前節(jié)點(diǎn)的所有命名空間節(jié)點(diǎn)椿肩。 | |
parent | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)。 | |
preceding | 選取文檔中當(dāng)前節(jié)點(diǎn)的開始標(biāo)簽之前的所有節(jié)點(diǎn)豺谈。 | |
preceding-sibling | 選取當(dāng)前節(jié)點(diǎn)之前的所有同級節(jié)點(diǎn)郑象。 | |
self | 選取當(dāng)前節(jié)點(diǎn)。 |
位置路徑表達(dá)式
位置路徑可以是絕對的核无,也可以是相對的扣唱。
絕對路徑起始于正斜杠( / ),而相對路徑不會這樣团南。在兩種情況中噪沙,位置路徑均包括一個或多個步,每個步均被斜杠分割:
絕對位置路徑:
/step/step/...
相對位置路徑:
step/step/...
XML 實(shí)例文檔
我們將在下面的例子中使用此 XML 文檔:
例子 結(jié)果
child::book 選取所有屬于當(dāng)前節(jié)點(diǎn)的子元素的 book 節(jié)點(diǎn)吐根。
attribute::lang 選取當(dāng)前節(jié)點(diǎn)的 lang 屬性正歼。
child::* 選取當(dāng)前節(jié)點(diǎn)的所有子元素。
attribute::* 選取當(dāng)前節(jié)點(diǎn)的所有屬性拷橘。
child::text() 選取當(dāng)前節(jié)點(diǎn)的所有文本子節(jié)點(diǎn)局义。
child::node() 選取當(dāng)前節(jié)點(diǎn)的所有子節(jié)點(diǎn)。
descendant::book 選取當(dāng)前節(jié)點(diǎn)的所有 book 后代冗疮。
ancestor::book 選擇當(dāng)前節(jié)點(diǎn)的所有 book 先輩萄唇。
ancestor-or-self::book 選取當(dāng)前節(jié)點(diǎn)的所有 book 先輩以及當(dāng)前節(jié)點(diǎn)(如果此節(jié)點(diǎn)是 book 節(jié)點(diǎn))
child::*/child::price 選取當(dāng)前節(jié)點(diǎn)的所有 price 孫節(jié)點(diǎn)。
XPath 運(yùn)算符
下面列出了可用在 XPath 表達(dá)式中的運(yùn)算符:
運(yùn)算符 描述 實(shí)例 返回值
| 計(jì)算兩個節(jié)點(diǎn)集 //book | //cd 返回所有擁有 book 和 cd 元素的節(jié)點(diǎn)集
+ 加法 6 + 4 10
- 減法 6 - 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80
如果 price 是 9.80术幔,則返回 true另萤。
如果 price 是 9.90,則返回 false。
!= 不等于 price!=9.80
如果 price 是 9.90四敞,則返回 true泛源。
如果 price 是 9.80,則返回 false忿危。
< 小于 price<9.80
如果 price 是 9.00达箍,則返回 true。
如果 price 是 9.90铺厨,則返回 false缎玫。
<= 小于或等于 price<=9.80
如果 price 是 9.00,則返回 true解滓。
如果 price 是 9.90碘梢,則返回 false。
> 大于 price>9.80
如果 price 是 9.90伐蒂,則返回 true。
如果 price 是 9.80肛鹏,則返回 false逸邦。
>= 大于或等于 price>=9.80
如果 price 是 9.90,則返回 true在扰。
如果 price 是 9.70缕减,則返回 false。
or 或 price=9.80 or price=9.70
如果 price 是 9.80芒珠,則返回 true桥狡。
如果 price 是 9.50,則返回 false皱卓。
and 與 price>9.00 and price<9.90
如果 price 是 9.80裹芝,則返回 true。
如果 price 是 8.50娜汁,則返回 false嫂易。
mod 計(jì)算除法的余數(shù) 5 mod 2 1
注:本文僅用于自己學(xué)習(xí)交流記錄使用。