日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

class参数传入 python_小白学 Python 爬虫(20):Xpath 进阶

發布時間:2023/12/10 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 class参数传入 python_小白学 Python 爬虫(20):Xpath 进阶 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

人生苦短,我用 Python

如果我的文章對您有幫助,請關注支持下作者的公眾號:極客挖掘機,您的關注,是對小編堅持原創的最大鼓勵:)

前文傳送門:

小白學 Python 爬蟲(1):開篇

小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝

小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門

小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門

小白學 Python 爬蟲(5):前置準備(四)數據庫基礎

小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝

小白學 Python 爬蟲(7):HTTP 基礎

小白學 Python 爬蟲(8):網頁基礎

小白學 Python 爬蟲(9):爬蟲基礎

小白學 Python 爬蟲(10):Session 和 Cookies

小白學 Python 爬蟲(11):urllib 基礎使用(一)

小白學 Python 爬蟲(12):urllib 基礎使用(二)

小白學 Python 爬蟲(13):urllib 基礎使用(三)

小白學 Python 爬蟲(14):urllib 基礎使用(四)

小白學 Python 爬蟲(15):urllib 基礎使用(五)

小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖

小白學 Python 爬蟲(17):Requests 基礎使用

小白學 Python 爬蟲(18):Requests 進階操作

小白學 Python 爬蟲(19):Xpath 基操

引言

文接上篇,我們接著聊,上篇我們介紹了 Xpath 一些常用的匹配方式, DOM 節點我們可以匹配出來了,這并不是我們的最終目的,我們是要從這些節點中取出來我們想要的數據。本篇我們接著介紹如何使用 Xpath 獲取數據。

文本獲取

我們先嘗試下獲取第一篇文章的題目,獲取節點中的文本我們可以使用 text() 來進行獲取,如圖:

代碼如下:

from lxml import etreeimport requestsresponse = requests.get('https://www.geekdigging.com/')html_str = response.content.decode('UTF-8')html = etree.HTML(html_str)result_1 = html.xpath('/html/body/section/div/div/main/article[1]/div[2]/div/h3/a/text()')print(result_1)

結果如下:

['小白學 Python 爬蟲(18):Requests 進階操作']

哇,上面示例里面的表達式好長啊,這個怎么寫出來的,怎么寫的稍后再說,先介紹一下這個表達式的意思,仔細看一下,這個表達式其實是從整個 HTML 源代碼的最外層的 標簽寫起,一層一層的定位到了我們所需要的節點,然后再使用 text() 方法獲取了其中的文本內容。

關于這個表達式怎么來的,肯定不是小編寫的,這么寫講實話是有點傻,完全沒必要從整個文檔的最外層開始寫。

其實這個是 Chrome 幫我們生成的,具體操作可見下圖:

這時 Chrome 會自動幫我們把這個節點的表達式 copy 到當前的剪切板上,只需要我們在程序里 ctrl + v 一下。

屬性獲取

有些情況下,我們可能不止需要節點中的文本數據,可能還會需要節點中的屬性數據,比如上面的示例,我們除了想知道文章標題,其實還想知道文章的跳轉路徑:

result_2 = html.xpath('/html/body/section/div/div/main/article[1]/div[2]/div/h3/a/@href')print(result_2)

結果如下:

['/2019/12/11/1468953802/']

這里需要注意的是,此處和屬性匹配的方法不同,屬性匹配是中括號加屬性名和值來限定某個屬性,如 [@class="container"] ,而此處的 @href 指的是獲取節點的某個屬性,二者需要做好區分。

屬性多值匹配

某些時候吧,某些節點的某個屬性可能有多個值,這個多見于 class 屬性,由于某些編碼習慣以及某些其他原因,這個屬性經常性會出現多個值,這時如果只使用其中的一個值的話,就無法匹配了。

如果這么寫的話:

result_3 = html.xpath('//div[@class="post-head"]')print(result_3)

結果如下:

[]

可以看到,這里沒有匹配到任何節點,這時,我們可以使用一個函數:contains() ,上面的示例可以改成這樣:

result_3 = html.xpath('//div[contains(@class, "post-head")]')print(result_3)

這樣通過 contains() 方法,第一個參數傳入屬性名稱,第二個參數傳入屬性值,只要此屬性包含所傳入的屬性值,就可以進行匹配了。

多屬性匹配

除了上面的一個屬性有多個值的情況,還經常會出現需要使用多個屬性才能確定一個唯一的節點。

這時,我們可以使用運算符來進行處理。

還是這個示例,我們獲取 這個節點,如果只是使用 class 屬性來進行獲取,會獲得很多個節點:

result_4 = html.xpath('//img[@class="img-ajax"]')print(result_4)

結果如下:

[, , , , , , , , , , , ]

如果我們加上 alt 屬性一起進行匹配的話,就可以獲得唯一的節點:

result_4 = html.xpath('//img[@class="img-ajax" and @]')print(result_4)

結果如下:

[]

Xpath 支持很多的運算符,詳細見下表(來源:https://www.w3school.com.cn/xpath/xpath_operators.asp)

運算符描述實例返回值計算兩個節點集//book //cd返回所有擁有 book 和 cd 元素的節點集+加法6 + 410-減法6 - 42*乘法6 * 424div除法8 div 42=等于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.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計算除法的余數5 mod 21

按順序選擇

有些時候,我們匹配出來很多的節點,但是我們只想獲取其中的某一個節點,比如第一個或者最后一個,這時可以使用中括號傳入索引的方法獲取特定次序的節點。

我們還是文章的題目為例,我們先獲取所有的文章題目,再進行選擇,示例代碼如下:

result_5 = html.xpath('//article/div/div/h3[@class="post-title"]/a/text()')print(result_5)result_6 = html.xpath('//article[1]/div/div/h3[@class="post-title"]/a/text()')print(result_6)result_7 = html.xpath('//article[last()]/div/div/h3[@class="post-title"]/a/text()')print(result_7)result_8 = html.xpath('//article[position() < 5]/div/div/h3[@class="post-title"]/a/text()')print(result_8)

結果如下:

['小白學 Python 爬蟲(18):Requests 進階操作', '小白學 Python 爬蟲(17):Requests 基礎使用', '小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖', '如何用 Python 寫一個簡易的抽獎程序', '小白學 Python 爬蟲(15):urllib 基礎使用(五)', '我們真的在被 APP “竊聽” 么?', '小白學 Python 爬蟲(14):urllib 基礎使用(四)', '小白學 Python 爬蟲(13):urllib 基礎使用(三)', '小白學 Python 爬蟲(12):urllib 基礎使用(二)', '小白學 Python 爬蟲(11):urllib 基礎使用(一)', '老司機大型車禍現場', '小白學 Python 爬蟲(10):Session 和 Cookies']['小白學 Python 爬蟲(18):Requests 進階操作']['小白學 Python 爬蟲(10):Session 和 Cookies']['小白學 Python 爬蟲(18):Requests 進階操作', '小白學 Python 爬蟲(17):Requests 基礎使用', '小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖', '如何用 Python 寫一個簡易的抽獎程序']

第一次,我們選取了當前頁面所有的文章的題目。

第二次,我們選擇了當前頁面第一篇文章的題目,這里注意下,中括號中傳入數字1即可,這里的開始是以 1 為第一個的,不是程序中的 0 為第一個。

第三次,我們使用 last() 函數,獲取了最后一篇文章的題目。

第四次,我們選擇了位置小于 5 的文章題目。

節點軸

軸可定義相對于當前節點的節點集。

軸名稱結果ancestor選取當前節點的所有先輩(父、祖父等)。ancestor-or-self選取當前節點的所有先輩(父、祖父等)以及當前節點本身。attribute選取當前節點的所有屬性。child選取當前節點的所有子元素。descendant選取當前節點的所有后代元素(子、孫等)。descendant-or-self選取當前節點的所有后代元素(子、孫等)以及當前節點本身。following選取文檔中當前節點的結束標簽之后的所有節點。namespace選取當前節點的所有命名空間節點。parent選取當前節點的父節點。preceding選取文檔中當前節點的開始標簽之前的所有節點。preceding-sibling選取當前節點之前的所有同級節點。self選取當前節點。

我們以 ancestor 軸來做示例:

# 節點軸示例# 獲取所有祖先節點result_9 = html.xpath('//article/ancestor::*')print(result_9)# 獲取祖先節點 main 節點result_10 = html.xpath('//article/ancestor::main')print(result_10)

結果如下:

[, , , , , ][]

關于節點軸就先介紹到這里,更多的軸的用法可以參考:https://www.w3school.com.cn/xpath/xpath_axes.asp 。

示例代碼

本系列的所有代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便大家取用。

示例代碼-Github

示例代碼-Gitee

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的class参数传入 python_小白学 Python 爬虫(20):Xpath 进阶的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。