利用python爬虫(part8)--Xpath路径表达式
學習筆記
編輯器:Sublime
注意:這里的理論部分是關于XML文檔的,但是介于HTML和XML的相似性,大家可以自行做類比,有的地方我也會用HTML和XML做類比。
上一篇:初識Xpath之Node節點
文章目錄
- Xpath路徑表達式
- 絕對路徑和相對路徑
- 定位步與節點集
- 軸及縮寫
- 節點測試
Xpath路徑表達式
一個Xpath路徑表達式由若干個"定位步"構成,一個Xpath路徑表達式將返回一個節點集。Xpath路徑表達式的核心是,表示滿足一定條件的標記所組成的集合。
絕對路徑和相對路徑
Xpath路徑表達式由若干"定位步"從左向右用/連接而構成。Xpath路徑表達式分為絕對路徑和相對路徑,從根節點開始(Document節點)的路徑表達式稱為絕對路徑,否則為相對路徑。
現給出一個簡單的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可以說,不用/開始的就是相對路徑。
定位步與節點集
- 定位步
“定位步”是構成Xpath的基本單位,用于確定出相應的若干節點。一個定位步由一個軸(axis)、節點測試(node test)和可選的謂詞構成。
定位步格式:
軸::節點測試[謂詞]"定位步"的作用找出節點;
軸的作用,是在樹形數據中,給出尋找節點的方向;
節點測試的作用,是給出尋找的節點應當屬于哪種細分的類型;
謂詞的作用,是給出所尋找的節點所需滿足的進一步條件。
在使用定位步時,必須要給出一個該定位步的節點,即當前節點。
以上面的test11.html文檔為例,我們寫幾個定位步:
child::ol上述定位步的軸為child,則當前節點會使用child軸尋找當前節點全部子節點。節點測試ol表示,限定所尋找的子節點名稱必須是ol,且節點類型必須是Element類型。
即,使用上述定位步所尋找的節點集,就是當前節點全部名字為ol的Element類型子節點。
如果我們對尋找的節點有點小要求,就可以使用謂詞,比如:
child::li[@class="Ra02"]上述定位步的當前節點,首先要找出當前節點的名字是li的全部Element類型子節點,然后使用謂詞[@class="Ra02"]從中篩選出class屬性值為"Ra02"的Element子節點。
- 節點集
Xpath路徑表達式,可以準確確定一個節點集,Xpath絕對路徑是以Document節點作為第1個定位步,該定位步不需要有軸、謂詞,習慣上稱Document節點為虛節點,因為在Xpath路徑中無法顯示的寫出該節點。
Xpath絕對路徑使用各個定位步最終尋找出一個節點集,尋找的規則如下:
Xpath路徑表達式尋找出的節點集也稱為Xpath路徑表達式返回的節點集,或Xpath路徑表達式的"值"
以上面的test11.html文檔為例,對于Xpath絕對路徑表達式:
/child::html/child::body/child::div第一個定位步為:
Document節點(即,根節點)
第二個定位步為:
child::html由于HTML文檔只有一個名為html的根標記,所以Document節點使用該定位步尋找出的節點集中只有一個名字是html的Element節點。
第三個定位步為:
child::bodyXpath在第2定位步后尋找的節點使用第3定位步尋找出的節點集中只有一個名字是body的Element節點。
第四定位步為:
child::divXpath在第3定位步后尋找的節點使用第4定位步尋找出的節點集中有2個Element,2個Element節點名字都是div, 2個Element節點的排序順序,就是名稱為div的3個標記在HTML文件中出現的先后順序。
簡單的說,/child::html/child::body/child::div最終返回的節點集就是HTML文件中名字是div的全部標記,但要求div標記的1級父節點是body,第2父節點是html.
軸及縮寫
現在給出幾個比較常用(???)的軸的縮寫和描述:
| child::節點測試 | 節點測試 | 當前節點的子節點 |
| descendant::節點測試 | /節點測試 | 當前節點的子孫節點 |
| parent::節點測試 | .. | 當前節點的父節點 |
| ancestor::節點測試 | 無縮寫 | 當前節點的祖先節點 |
| following::節點測試 | 無縮寫 | 當前節點的弟節點 |
| preceding::節點測試 | 無縮寫 | 當前節點的兄節點 |
| self::節點測試 | . | 當前節點 |
| attribute::屬性名 | @屬性名 | 當前節點所關聯的Attribute節點 |
節點測試
我們看一下幾個常見的節點測試以及作用:
| 標記的名字 | 尋找指定名字的Element類型節點 |
| text() | 尋找Text類型節點 |
| node() | 尋找Node類型節點 |
| * | 尋找任意名字的Element類型節點 |
| comment() | 尋找Comment類型節點 |
總結
以上是生活随笔為你收集整理的利用python爬虫(part8)--Xpath路径表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017十大最受欢迎ip游戏排行榜:青云
- 下一篇: int是什么_十进制数16的16进制表示