初識爬蟲 xpath 簡單應用(扇貝單詞)

2021-10-07 02:00:10 字數 3561 閱讀 7816

今天跟著老師爬取扇貝單詞的網頁版,是把網頁內的單詞及其翻譯爬取到本地,並儲存成 txt 檔案,網頁是這樣的:

那麼下面進入正題:

開始同以往一樣,匯入包,獲取 url ,發起請求,獲得響應:

url = ''

response = requests.get(url=url).text

# print(response)

這裡我們是把接收網頁響應的 response 格式設定成了文字格式,因為到後面我們就可以直接使用 response 結果,不用再變格式了。列印出來我們發現是目標網頁的源**,並且也沒有亂碼,說明就沒什麼問題。

下面我們會用到 xpath 去獲取我們想要的網頁元素,如果不懂 xpath 的可以直接去 w3c手冊上 看一下使用教程,或者看我這篇部落格:xpath 全解 。在使用 xpath 前,我們還需要變換成 xpath 能查詢的格式,就類似於資料結構上的二叉樹那種,從樹根結點往下,乙個乙個子結點地去找,直到找到目標結點為止。

#使用模組

from lxml import etree

# 利用 etree 轉換頁面格式,提取資訊

tree = etree.html(response)

下面我們就該去網頁原始碼中找目標結點了,找到如下:

首先我們考慮直接用 tr 屬性標籤行不行(一般都是不行的),那麼我們獲取當前結點下的所有 tr 屬性標籤,並驗證一下對不對:

# 找 tr :20個

tr = tree.xpath('//tr')

print(len(tr)) #找多了

上面我們變換格式後,tree就是當前結點,而當前結點是根結點,而我們查取的 tr 屬性標籤即是從當前整個原始碼中查詢 tr 標籤的結點,單詞當前頁面下只有20個,所以我們只需要判斷獲取的 tr 標籤個數多不多於20就行了,輸出結果是多餘的,說明直接用 tr 標籤去獲取單詞的方法是不可行的,會涉及到其他無關的內容。那麼下面的方法就是我們一般常用到的方法:

tr_list = tree.xpath("//table[@class='table table-bordered table-striped']/tbody/tr")

print(len(tr_list))

首先我們定位到 class 屬性值等於 「 table table-bordered table-striped 」 的 table 標籤位置,再從 table 下找到 tbody 標籤,再深入一層就是我們的目標 tr 便簽了,經驗證個數後也是對的,那麼現在我們是定位到了每一條單詞的資訊,下面我們要做的就是從當前一條資訊中提取到我們要的單詞及其翻譯的內容。再次觀察網頁原始碼:

接下來,我們逐個獲取每條單詞資訊中的單詞及其翻譯:

for tr in tr_list :

# 單詞

word = tr.xpath("./td/strong/text()")

# 翻譯

fanyi = tr.xpath('./td/text()')

print(word)

print(fanyi)

執行後發現結果沒錯,是我們想要的輸出,但發現輸出內容還是有點不對:

輸出的內容有些像列表型別,我們檢視輸出型別後確實是 list 型別,看著輸出內容上加的引號很不舒服,解決只需要稍微改動一點輸出形式就行了:

print(word[0])

print(fanyi[0])

再次輸出的時候就很正常了。到此我們主要的工作就差不多完成了,下面我們將爬取到的資訊儲存成 txt 檔案:

info = 'word:' + str(word[0]) + '\n' + 'fanyi:' + str(fanyi[0]) +'\n\n'

with open('扇貝.txt','a',encoding='utf-8') as fp:

fp.write(info)

我們將單詞及其翻譯連線成一條資訊,在向檔案中儲存的時候,其內容只能是字串,所以有了上面的型別轉換(讀者可自行檢視下 word[0] 是什麼資料型別),另外儲存時,『 a 』 表示向檔案中追加元素,因為是在 for 迴圈下,每讀一條單詞的資料,分析提取後就追加到 txt 檔案中。

到此為止,簡單的扇貝單詞就爬下來了;不過我們看到這一單元的必備詞彙不止 20 個,後面還有兩頁,都爬下來最好。其實也很簡單,我們在第一頁和第二頁的時候,對比**會發現它們的規律,所以全都爬取的話,只需要在最外層加乙個 for 迴圈,另外對 url 稍做一下改動就可以了。

下面是完整**:

import requests

from lxml import etree

# 1、發起請求,獲取響應

for i in range(1,4):

url = ''.format(i)

response = requests.get(url=url).text

# print(response)

# 利用 etree 轉換頁面格式,提取資訊

tree = etree.html(response)

# 要求:提取每乙個單詞及其翻譯

# 1)、找 tr :20個

# tr = tree.xpath('//tr')

# print(len(tr)) 找多了

tr_list = tree.xpath("//table[@class='table table-bordered table-striped']/tbody/tr")

# print(len(tr_list))

# print(tr_list)

for tr in tr_list :

# 單詞

word = tr.xpath("./td/strong/text()")

# 翻譯

fanyi = tr.xpath('./td/text()')

# print(word)

# # print(fanyi)

print(word[0])

print(fanyi[0])

info = 'word:' + str(word[0]) + '\n' + 'fanyi:' + str(fanyi[0]) +'\n\n'

with open('danci.txt','a',encoding='utf-8') as fp:

fp.write(info)

pass

爬蟲(六)xpath解析及其應用

在了解xpath前我要先了解xml xml 被設計用來傳輸和儲存資料。區別於html。xml是用來儲存和傳輸資料的 和html的不同點 1 html用來顯示資料,xml是用來傳輸資料的 2 html標籤是固定的,xml標籤是自定義的 而xpath 是一門在 xml 文件中查詢資訊的語言。xpath ...

Python爬蟲 XPath快速掌握並應用

快速學習並應用一門技術,是一種能力 什麼是xpath?xpath是一門在html xml文件中查詢資訊的語言,常用於在網路爬蟲爬下的網頁html源 中,查詢定位特定標籤裡的資料。xpath路徑表示式 在網路爬蟲中使用xpath,只需要掌握 xpath路徑表示式即可。xpath 使用路徑表示式來選取 ...

XPath在python爬蟲中的高階應用

xpath在python的爬蟲學習中,起著舉足輕重的地位,對比正規表示式 re兩者可以完成同樣的工作,實現的功能也差不多,但xpath明顯比re具有優勢,在網頁分析上使re退居二線。xpath介紹 是什麼?全稱為xml path language 一種小型的查詢語言 說道xpath是門語言,不得不說...