利用python爬虫(part8)--Xpath路径表达式
學(xué)習(xí)筆記
編輯器:Sublime
注意:這里的理論部分是關(guān)于XML文檔的,但是介于HTML和XML的相似性,大家可以自行做類比,有的地方我也會用HTML和XML做類比。
上一篇:初識Xpath之Node節(jié)點
文章目錄
- Xpath路徑表達(dá)式
- 絕對路徑和相對路徑
- 定位步與節(jié)點集
- 軸及縮寫
- 節(jié)點測試
Xpath路徑表達(dá)式
一個Xpath路徑表達(dá)式由若干個"定位步"構(gòu)成,一個Xpath路徑表達(dá)式將返回一個節(jié)點集。Xpath路徑表達(dá)式的核心是,表示滿足一定條件的標(biāo)記所組成的集合。
絕對路徑和相對路徑
Xpath路徑表達(dá)式由若干"定位步"從左向右用/連接而構(gòu)成。Xpath路徑表達(dá)式分為絕對路徑和相對路徑,從根節(jié)點開始(Document節(jié)點)的路徑表達(dá)式稱為絕對路徑,否則為相對路徑。
現(xiàn)給出一個簡單的HTML文檔(這個文檔,之后也要用到),我們將這個文檔命名為test11.html:
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Xpath</title> </head> <body><ol><li class="Ra01"><name class = 'Bunny01'>Huang</name><age>8</age><food>carrot</food></li><li class="Ra01"><name class = 'Bunny02'>Bai</name><age>10</age><food>celery</food></li><li class="Ra02"><name class = 'Bunny03'>Jack</name><age>20</age><food>cucumber</food></li><li class="Ra03"><name class = 'Bunny03'>Tim</name><age>30</age><food>straw</food></li></ol><div class='description'> <p>Bunny like to eat ....<a href="http://www.bunny.com/">Anything</a></p></div><div class='advertising'> <p>welcome to buy our product ....<a href="http://www.bunnyproduct.com/">Perfact!</a></p></div> </body> </html>對于上面的html文件,我們寫個絕對路徑:
/html/head/title可以說,用/開始的就是絕對路徑。
我們再寫一個相對路徑:
head/title可以說,不用/開始的就是相對路徑。
定位步與節(jié)點集
- 定位步
“定位步”是構(gòu)成Xpath的基本單位,用于確定出相應(yīng)的若干節(jié)點。一個定位步由一個軸(axis)、節(jié)點測試(node test)和可選的謂詞構(gòu)成。
定位步格式:
軸::節(jié)點測試[謂詞]"定位步"的作用找出節(jié)點;
軸的作用,是在樹形數(shù)據(jù)中,給出尋找節(jié)點的方向;
節(jié)點測試的作用,是給出尋找的節(jié)點應(yīng)當(dāng)屬于哪種細(xì)分的類型;
謂詞的作用,是給出所尋找的節(jié)點所需滿足的進(jìn)一步條件。
在使用定位步時,必須要給出一個該定位步的節(jié)點,即當(dāng)前節(jié)點。
以上面的test11.html文檔為例,我們寫幾個定位步:
child::ol上述定位步的軸為child,則當(dāng)前節(jié)點會使用child軸尋找當(dāng)前節(jié)點全部子節(jié)點。節(jié)點測試ol表示,限定所尋找的子節(jié)點名稱必須是ol,且節(jié)點類型必須是Element類型。
即,使用上述定位步所尋找的節(jié)點集,就是當(dāng)前節(jié)點全部名字為ol的Element類型子節(jié)點。
如果我們對尋找的節(jié)點有點小要求,就可以使用謂詞,比如:
child::li[@class="Ra02"]上述定位步的當(dāng)前節(jié)點,首先要找出當(dāng)前節(jié)點的名字是li的全部Element類型子節(jié)點,然后使用謂詞[@class="Ra02"]從中篩選出class屬性值為"Ra02"的Element子節(jié)點。
- 節(jié)點集
Xpath路徑表達(dá)式,可以準(zhǔn)確確定一個節(jié)點集,Xpath絕對路徑是以Document節(jié)點作為第1個定位步,該定位步不需要有軸、謂詞,習(xí)慣上稱Document節(jié)點為虛節(jié)點,因為在Xpath路徑中無法顯示的寫出該節(jié)點。
Xpath絕對路徑使用各個定位步最終尋找出一個節(jié)點集,尋找的規(guī)則如下:
Xpath路徑表達(dá)式尋找出的節(jié)點集也稱為Xpath路徑表達(dá)式返回的節(jié)點集,或Xpath路徑表達(dá)式的"值"
以上面的test11.html文檔為例,對于Xpath絕對路徑表達(dá)式:
/child::html/child::body/child::div第一個定位步為:
Document節(jié)點(即,根節(jié)點)
第二個定位步為:
child::html由于HTML文檔只有一個名為html的根標(biāo)記,所以Document節(jié)點使用該定位步尋找出的節(jié)點集中只有一個名字是html的Element節(jié)點。
第三個定位步為:
child::bodyXpath在第2定位步后尋找的節(jié)點使用第3定位步尋找出的節(jié)點集中只有一個名字是body的Element節(jié)點。
第四定位步為:
child::divXpath在第3定位步后尋找的節(jié)點使用第4定位步尋找出的節(jié)點集中有2個Element,2個Element節(jié)點名字都是div, 2個Element節(jié)點的排序順序,就是名稱為div的3個標(biāo)記在HTML文件中出現(xiàn)的先后順序。
簡單的說,/child::html/child::body/child::div最終返回的節(jié)點集就是HTML文件中名字是div的全部標(biāo)記,但要求div標(biāo)記的1級父節(jié)點是body,第2父節(jié)點是html.
軸及縮寫
現(xiàn)在給出幾個比較常用(???)的軸的縮寫和描述:
| child::節(jié)點測試 | 節(jié)點測試 | 當(dāng)前節(jié)點的子節(jié)點 |
| descendant::節(jié)點測試 | /節(jié)點測試 | 當(dāng)前節(jié)點的子孫節(jié)點 |
| parent::節(jié)點測試 | .. | 當(dāng)前節(jié)點的父節(jié)點 |
| ancestor::節(jié)點測試 | 無縮寫 | 當(dāng)前節(jié)點的祖先節(jié)點 |
| following::節(jié)點測試 | 無縮寫 | 當(dāng)前節(jié)點的弟節(jié)點 |
| preceding::節(jié)點測試 | 無縮寫 | 當(dāng)前節(jié)點的兄節(jié)點 |
| self::節(jié)點測試 | . | 當(dāng)前節(jié)點 |
| attribute::屬性名 | @屬性名 | 當(dāng)前節(jié)點所關(guān)聯(lián)的Attribute節(jié)點 |
節(jié)點測試
我們看一下幾個常見的節(jié)點測試以及作用:
| 標(biāo)記的名字 | 尋找指定名字的Element類型節(jié)點 |
| text() | 尋找Text類型節(jié)點 |
| node() | 尋找Node類型節(jié)點 |
| * | 尋找任意名字的Element類型節(jié)點 |
| comment() | 尋找Comment類型節(jié)點 |
總結(jié)
以上是生活随笔為你收集整理的利用python爬虫(part8)--Xpath路径表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017十大最受欢迎ip游戏排行榜:青云
- 下一篇: 利用python爬虫(part9)--X