Python爬蟲基礎(chǔ)之XPath語(yǔ)法與lxml庫(kù)的用法詳解
前言
本來(lái)打算寫的標(biāo)題是XPath語(yǔ)法,但是想了一下Python中的解析庫(kù)lxml,使用的是Xpath語(yǔ)法,同樣也是效率比較高的解析方法,所以就寫成了XPath語(yǔ)法和lxml庫(kù)的用法
XPath 即為 XML 路徑語(yǔ)言,它是一種用來(lái)確定 XML(標(biāo)準(zhǔn)通用標(biāo)記語(yǔ)言的子集)文檔中某部分位置的語(yǔ)言。
XPath 基于 XML 的樹(shù)狀結(jié)構(gòu),提供在數(shù)據(jù)結(jié)構(gòu)樹(shù)中找尋節(jié)點(diǎn)的能力。 XPath 同樣也支持HTML。
XPath 是一門小型的查詢語(yǔ)言。
python 中 lxml庫(kù) 使用的是 Xpath 語(yǔ)法,是效率比較高的解析方法。
下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧
安裝
為什么要用這個(gè)庫(kù)呢,因?yàn)橐獙懪老x啊,利用lxml庫(kù)來(lái)解析 HTML 代碼,同時(shí)lxml也繼承了libxml2的特性自動(dòng)修正HTML代碼,利用pip安裝即可
pip install lxml
XPath語(yǔ)法
XPath是一門在XML文檔中查找信息的語(yǔ)言,可以用于在XML文檔中通過(guò)元素和屬性進(jìn)行導(dǎo)航
舉個(gè)栗子 😎
我們可以使用XPath提取網(wǎng)站地圖中的所有鏈接,也就是說(shuō)可以使用XPath去找我們HTML中的一些具體的東西
節(jié)點(diǎn)關(guān)系
在XPath中,有七種類型的節(jié)點(diǎn):元素、屬性、文本、命名空間、處理指令、注釋以及文檔節(jié)點(diǎn)(或稱為根節(jié)點(diǎn))
再舉個(gè)栗子 😎
<urlset> <url> <loc>https://qq52o.me</loc> <lastmod>2018-04-28T19:00:42+00:00</lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url> </urlset>
第一個(gè):父(Parent)
每個(gè)元素以及屬性都有一個(gè)父
url元素是 loc、lastmod、changefreq以及 priority元素的父
第二個(gè):子(Children)
元素節(jié)點(diǎn)可有零個(gè)、一個(gè)或多個(gè)子
loc、lastmod、changefreq以及 priority元素都是url元素的子
第三個(gè):同胞(Sibling)
擁有相同的父的節(jié)點(diǎn)
loc、lastmod、changefreq以及 priority元素都是url元素的同胞
第四個(gè):先輩(Ancestor)
某節(jié)點(diǎn)的父、父的父,等等
loc元素的先輩是 url元素和 urlset元素
第五個(gè):后代(Descendant)
某個(gè)節(jié)點(diǎn)的子,子的子,等等
urlset的后代是url、loc、lastmod、changefreq以及 priority元素
如果你分不清楚,就按照子元素從上到下的去找元素節(jié)點(diǎn)
選取節(jié)點(diǎn)
XPath使用路徑表達(dá)式在 XML 文檔中選取節(jié)點(diǎn),節(jié)點(diǎn)是通過(guò)沿著路徑或者 step 來(lái)選取的,也就是上面所說(shuō)的按照子元素從上到下去找元素節(jié)點(diǎn)
這些是最有用的路徑表達(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á)式 | 結(jié)果 |
|---|---|
| urlset | 選取urlset元素的所有子節(jié)點(diǎn) |
| /urlset | 選取根元素 urlset |
| urlset/url | 選取屬于urlset的子元素的所有url元素 |
| //url | 選取所有url子元素,而不管它們?cè)谖臋n中的位置 |
| urlset//url | 選擇屬于urlset元素的后代的所有url元素,而不管它們位于urlset之下的什么位置 |
| //@href | 選取名為href的所有屬性 |
其他XPath語(yǔ)法請(qǐng)參考w3school
XPath實(shí)例測(cè)試
提取本站網(wǎng)站地圖中id屬性為content的的子元素h3的內(nèi)容以及子元素a的href屬性,F(xiàn)12去看代碼找這個(gè)屬性

div的id屬性,下面的子元素h3的內(nèi)容,直接利用 text 方法來(lái)獲取元素的內(nèi)容,然后輸出

這里的子元素層級(jí)關(guān)系必須按順序?qū)懞?,不然?huì)報(bào)錯(cuò)的
IndexError: list index out of range
這就說(shuō)明你的XPath規(guī)則沒(méi)寫好,list是一個(gè)空的,沒(méi)有一個(gè)元素
XPath 是一個(gè)非常好用的解析方法,同時(shí)也是作為爬蟲學(xué)習(xí)的基礎(chǔ)
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Python lxml解析HTML并用xpath獲取元素的方法
- Python基于lxml模塊解析html獲取頁(yè)面內(nèi)所有葉子節(jié)點(diǎn)xpath路徑功能示例
- python中requests庫(kù)+xpath+lxml簡(jiǎn)單使用
- python 網(wǎng)頁(yè)解析器掌握第三方 lxml 擴(kuò)展庫(kù)與 xpath 的使用方法
- python爬蟲lxml庫(kù)解析xpath網(wǎng)頁(yè)過(guò)程示例
- Python操作lxml庫(kù)之基礎(chǔ)使用篇
- Python操作lxml庫(kù)實(shí)戰(zhàn)之Xpath篇
相關(guān)文章
python實(shí)現(xiàn)登陸知乎獲得個(gè)人收藏并保存為word文件
這篇文章主要介紹了python實(shí)現(xiàn)登陸知乎獲得個(gè)人收藏并保存為word文件,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-03-03
從請(qǐng)求到響應(yīng)過(guò)程中django都做了哪些處理
這篇文章主要給大家介紹了關(guān)于從請(qǐng)求到響應(yīng)過(guò)程中django都做了哪些處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08
Python請(qǐng)求庫(kù)發(fā)送HTTP POST請(qǐng)求的示例代碼
這段代碼使用了Python的requests庫(kù)來(lái)發(fā)送HTTP POST請(qǐng)求,向本地服務(wù)器的API發(fā)送數(shù)據(jù),并處理響應(yīng),一步步解釋這個(gè)代碼2024-08-08
如何不用安裝python就能在.NET里調(diào)用Python庫(kù)
這篇文章主要介紹了如何不用安裝python就能在.NET里調(diào)用Python庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
對(duì)python創(chuàng)建及引用動(dòng)態(tài)變量名的示例講解
今天小編就為大家分享一篇對(duì)python創(chuàng)建及引用動(dòng)態(tài)變量名的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Python標(biāo)準(zhǔn)庫(kù)datetime之datetime模塊用法分析詳解
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫(kù)datetime之datetime模塊用法分析詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-07-07
實(shí)現(xiàn)用python算法計(jì)算圓周率的小訣竅
什么!你不會(huì)背圓周率(鄙夷的眼神) 3.1415926535 8979323846 26433... 但是,我會(huì)算啊,本文用一個(gè)簡(jiǎn)單的python代碼,教你計(jì)算圓周率2021-08-08
使用 django orm 寫 exists 條件過(guò)濾實(shí)例
這篇文章主要介紹了使用 django orm 寫 exists 條件過(guò)濾實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05

