Xpath學(xué)習(xí)

在對解析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)文檔,并記錄如下:


鏈接:
lxml - 使用Python的XML和HTML

學(xué)爬蟲利器XPath,看這一篇就夠了

文章摘錄自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í)交流記錄使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掐禁,一起剝皮案震驚了整個濱河市怜械,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌傅事,老刑警劉巖缕允,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹭越,居然都是意外死亡障本,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門般又,熙熙樓的掌柜王于貴愁眉苦臉地迎上來彼绷,“玉大人巍佑,你說我怎么就攤上這事〖拿酰” “怎么了萤衰?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長猜旬。 經(jīng)常有香客問我脆栋,道長,這世上最難降的妖魔是什么洒擦? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任椿争,我火速辦了婚禮,結(jié)果婚禮上熟嫩,老公的妹妹穿的比我還像新娘秦踪。我一直安慰自己,他們只是感情好掸茅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布椅邓。 她就那樣靜靜地躺著,像睡著了一般昧狮。 火紅的嫁衣襯著肌膚如雪景馁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天逗鸣,我揣著相機(jī)與錄音合住,去河邊找鬼。 笑死撒璧,一個胖子當(dāng)著我的面吹牛透葛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卿樱,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼获洲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了殿如?” 一聲冷哼從身側(cè)響起贡珊,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎涉馁,沒想到半個月后门岔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烤送,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年寒随,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡妻往,死狀恐怖互艾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讯泣,我是刑警寧澤纫普,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站好渠,受9級特大地震影響昨稼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拳锚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一假栓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧霍掺,春花似錦匾荆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至连躏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贞滨,已是汗流浹背入热。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晓铆,地道東北人勺良。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像骄噪,于是被迫代替她去往敵國和親尚困。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容