Python實(shí)戰(zhàn)使用XPath采集數(shù)據(jù)示例解析
lxml
lxml 是 Python 的一個(gè)庫,用于解析和呈現(xiàn) XML 和 HTML。它支持多種內(nèi)置和第三方 XML 和 HTML 標(biāo)記,例如 <a>
,<img>
,<form>
,<ul>
,<li>
,<ol>
,<dl>
,<dt>
,<dd>
等。lxml 還支持使用正則表達(dá)式來解析和呈現(xiàn) XML 和 HTML。
本文我們就介紹lxml的使用方法,我們使用lxml獲取我們想要的數(shù)據(jù)。
發(fā)送請求
首先,我們要進(jìn)行數(shù)據(jù)來源分析,知道我們的需求是什么?
明確需求:
- 明確采集網(wǎng)站是什么?
- 明確采集數(shù)據(jù)是什么?
我們都玩過4399小游戲,我們想獲取游戲名稱和游戲鏈接,并保存下來。首先,我們導(dǎo)入相關(guān)的庫文件。
import csv import requests from lxml import etree
接下來,我們可以發(fā)送請求,獲取網(wǎng)頁源代碼,代碼如下。
url = 'https://www.4399.com/flash_fl/2_1.htm' headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36' } res = requests.get(url, headers=headers) res.encoding = res.apparent_encoding
這段代碼是一個(gè) Python 的 requests
模塊的示例代碼,用于從 https://www.4399.com/flash_fl/2_1.htm
這個(gè)網(wǎng)站上獲取數(shù)據(jù)并將其轉(zhuǎn)換為 HTML 格式。
首先,我們定義了一個(gè) url
變量,它包含了要從網(wǎng)站上獲取數(shù)據(jù)的 URL。然后,我們使用 headers
字典來設(shè)置請求頭,包括 user-agent
頭部,用于指定瀏覽器的 User-Agent 信息。
接下來,我們使用 requests.get()
函數(shù)來發(fā)送一個(gè) HTTP GET 請求,并將 headers
字典作為請求頭傳遞給它。這個(gè)函數(shù)會返回一個(gè) Response
對象,我們可以使用 res.encoding
屬性來獲取請求的編碼方式,并將其設(shè)置為 res.apparent_encoding
,以便在輸出 HTML 時(shí)使用相同的編碼方式。
最后,我們將請求的編碼方式設(shè)置為瀏覽器的默認(rèn)編碼方式,以便在輸出 HTML 時(shí)使用相同的編碼方式。
解析數(shù)據(jù)
接下來,我們用xpath解析數(shù)據(jù)。我們用開發(fā)者工具定位到標(biāo)簽位置。
html_data = etree.HTML(res.text) lis = html_data.xpath('//*[@class="bre m15"]//ul/li') for li in lis: href = li.xpath('./a/@href')[0] title = li.xpath('./a/img/@alt')[0]
接下來,我們使用 html_data.xpath
方法來解析 HTML 文檔中的 ul
和 li
元素,并將它們存儲在 lis
變量中。
最后,我們使用 for
循環(huán)遍歷 lis
,并使用 li.xpath
方法來獲取每個(gè) li
元素的 a
元素的 href
和 alt
屬性,并將它們存儲在 href
和 title
變量中。 我們運(yùn)行結(jié)果之后,我們還要對鏈接進(jìn)行拼接。
保存數(shù)據(jù)
接下來就是保存數(shù)據(jù),先寫入頭文件。
f = open('4399小游戲.csv', mode='a', encoding='utf-8', newline='') csv_writer = csv.DictWriter(f, fieldnames=['游戲名稱', '游戲網(wǎng)站']) csv_writer.writeheader()
這段代碼中,我們首先使用 Python 的 open()
函數(shù)打開了一個(gè)名為 "4399小游戲.csv" 的文件,文件模式為 a
,表示追加模式。
然后,我們使用 Python 的 csv
模塊創(chuàng)建了一個(gè)名為 csv_writer
的 DictWriter
對象,并使用 writeheader()
方法來寫入表頭。
最后,我們使用 write()
方法向文件中寫入數(shù)據(jù),數(shù)據(jù)內(nèi)容為一個(gè)字典對象。
這段代碼的作用是將一個(gè)字典對象寫入到文件中,其中包含了游戲名稱和游戲網(wǎng)站兩個(gè)字段的數(shù)據(jù)。
需要注意的是,在寫入數(shù)據(jù)之前,我們需要使用 csv.DictWriter()
函數(shù)來創(chuàng)建一個(gè) DictWriter
對象,并使用 fieldnames
參數(shù)來指定字段名稱。此外,我們還需要使用 newline=''
參數(shù)來避免在 Windows 系統(tǒng)中出現(xiàn)換行符問題。 '''
dit = { '游戲名稱': title, '游戲網(wǎng)站': data_url, } csv_writer.writerow(dit)
'''
以上就是Python實(shí)戰(zhàn)使用XPath采集數(shù)據(jù)示例解析的詳細(xì)內(nèi)容,更多關(guān)于Python XPath采集數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python獲取天氣接口給指定微信好友發(fā)天氣預(yù)報(bào)
這篇文章主要介紹了python獲取天氣接口給指定微信好友發(fā)天氣預(yù)報(bào)的步驟,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-12-12Python Pandas 箱線圖的實(shí)現(xiàn)
這篇文章主要介紹了Python Pandas 箱線圖的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07Python項(xiàng)目 基于Scapy實(shí)現(xiàn)SYN泛洪攻擊的方法
今天小編就為大家分享一篇Python項(xiàng)目 基于Scapy實(shí)現(xiàn)SYN泛洪攻擊的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07用Python編寫簡單的gRPC服務(wù)的詳細(xì)過程
gRPC 是可以在任何環(huán)境中運(yùn)行的現(xiàn)代開源高性能 RPC 框架。接下來通過本文給大家介紹用Python編寫簡單的gRPC服務(wù)的詳細(xì)過程,感興趣的朋友一起看看吧2021-07-07PyTorch實(shí)現(xiàn)ResNet50、ResNet101和ResNet152示例
今天小編就為大家分享一篇PyTorch實(shí)現(xiàn)ResNet50、ResNet101和ResNet152示例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01python單例模式的應(yīng)用場景實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于python單例模式的應(yīng)用場景實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-02-02Python錯(cuò)誤NameError:name?'X'?is?not?defined的解決方法
這篇文章主要給大家介紹了關(guān)于Python錯(cuò)誤NameError:name?‘X‘?is?not?defined的解決方法,這是最近工作中遇到的一個(gè)問題,文中通過實(shí)例代碼將解決的方法介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03python pandas 對時(shí)間序列文件處理的實(shí)例
今天小編就為大家分享一篇python pandas 對時(shí)間序列文件處理的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06