Python數(shù)據(jù)提取-lxml模塊
知識(shí)點(diǎn):
- 了解lxml模塊和
xpath
語法的關(guān)系; - 了解lxml模塊的使用場(chǎng)景;
- 了解lxml模塊的安裝;
- 了解 谷歌瀏覽器
xpath helper
插件的安裝和使用; - 掌握xpath語法-基礎(chǔ)節(jié)點(diǎn)選擇語法;
- 掌握 xpath語法 -節(jié)點(diǎn)修飾語法;
- 掌握xpath語法 - 其他常用語法;
- 掌握 lmxl模塊中使用xpath語法定位元素提取數(shù)學(xué)值或文本內(nèi)容;
- 掌握lxml模塊etree.tostring函數(shù)的使用;
1、了解lxml模塊和xpath語法
對(duì)html
或xml形式的文本提取特定的內(nèi)容,就需要我們掌握lxml模塊的使用和xpath語法。
lxml模塊可以利用xPath規(guī)則語法,來快速的定位HEML \ XML 文檔中特定元素以及獲取節(jié)點(diǎn)信息(文本內(nèi)容、屬性值);XPath
(XML Path Language)是一門HTML\XML 文檔中查找信息的語言,可用來在HTML|XML文檔中對(duì)元素和屬性進(jìn)行遍歷。
提取xml、html的數(shù)據(jù)需要lxml模塊和xpath語法配合使用;
2、谷歌瀏覽器xpath helper插件的安裝和使用
- 在谷歌瀏覽器中對(duì)當(dāng)前頁面測(cè)試xpath語法規(guī)則。
- 谷歌瀏覽器xpath helper插件的安裝和使用
我們以windows
為例進(jìn)行xpath helper的安裝。
xpath helper
插件的安裝:
- 1)、下載Chrome插件 XPath Helper
- 可以在Chrome應(yīng)用商城進(jìn)行下載,如果無法下載,也可以從下面的鏈接進(jìn)行下載
- 2)、把文件的后綴名crx改為rar,然后解壓到同名文件夾中;
- 3)、把解壓后的文件夾拖入到已經(jīng)開啟開發(fā)者模式的chrome瀏覽器擴(kuò)展程序界面;
3、xpath 的節(jié)點(diǎn)關(guān)系
學(xué)習(xí)xpath語法需要先了解xpath中的節(jié)點(diǎn)關(guān)系。
3.1 xpath中的節(jié)點(diǎn)什么
每個(gè)html
、xml的標(biāo)簽我們都稱之為節(jié)點(diǎn),其中最頂層的節(jié)點(diǎn)稱為根節(jié)點(diǎn)。我們以xml
為例、html也是一樣的。、
3.2 xpath中節(jié)點(diǎn)的關(guān)系
author
是 title
的第一個(gè)兄弟節(jié)點(diǎn)。
4、xpath語法 - 選取節(jié)點(diǎn)以及提取屬性或文本內(nèi)容的語法
- 1)、XPath 使用路徑表達(dá)式來選取XML文檔中的節(jié)點(diǎn)或者節(jié)點(diǎn)集。
- 2)、這些路徑表達(dá)式和我們?cè)诔R?guī)的電腦文件系統(tǒng)中看到的表達(dá)式非常相似;
- 3)、使用chrome插件選擇標(biāo)簽時(shí)候,選中的標(biāo)簽會(huì)添加屬性class=“xh-highlight”;
4.1 xpath定位節(jié)點(diǎn)以及提取屬性或文本內(nèi)容的語法
5、xpath 語法 - 選取特定節(jié)點(diǎn)的語法
可以根據(jù)標(biāo)簽的屬性值,下標(biāo)等來獲取特定的節(jié)點(diǎn)。
5.1 選取特定節(jié)點(diǎn)的語法
5.2 關(guān)于xpath的下標(biāo)
在xpath中,第一個(gè)元素的位置是1;
最后一個(gè)元素的位置是last();
倒數(shù)第二個(gè)是last() - 1;
6、xpath語法 - 選取未知節(jié)點(diǎn)的語法
可以同通配符來選取未知的html
、xml
的元素。
6.1、選取未知節(jié)點(diǎn)的語法
7.lxml模塊的安裝與使用示例
lxml模塊是一個(gè)第三方模塊,安裝之后使用。
7.1 lxml模塊的安裝
對(duì)發(fā)送請(qǐng)求獲取的xml或html形式的響應(yīng)內(nèi)容進(jìn)行提取。
pip install lxml
7.2 爬蟲對(duì)html提取的內(nèi)容
提取標(biāo)簽中的文本內(nèi)容;
提取標(biāo)簽中的屬性的值;
比如,提取a標(biāo)簽中href屬性的值,獲取url,進(jìn)而繼續(xù)發(fā)起請(qǐng)求。
7.3 lxml模塊的使用
1)、導(dǎo)入lxml的etree庫(kù)
from lxml import etree
2)、利用etree.HTML
,將html字符串(bytes類型或str類型)轉(zhuǎn)化為Element
對(duì)象,Element
對(duì)象具有xpath的方法,返回結(jié)果的類別。
html = etree.HTML(text) ret_list = html.xpath("xpath語法規(guī)則字符串")
3)、xpath方法返回列表的三種情況
返回空列表:根據(jù)xpath語法規(guī)則字符串,沒有定位到任何元素;
返回由字符串構(gòu)成的列表:xpath字符串規(guī)則匹配的一定是文本內(nèi)容或某屬性的值;
返回由Element
對(duì)象構(gòu)成的列表:xpath規(guī)則字符串匹配的是標(biāo)簽,列表中的Element
對(duì)象可以繼續(xù)進(jìn)行xpath;
import requests from lxml import etree class Tieba(object): ? ? def __init__(self,name): ? ? ? ? self.url = "https://tieba.baidu.com/f?ie=utf-8&kw={}".format(name) ? ? ? ? self.headers = { ? ? ? ? ? ? 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36' ? ? ? ? } ? ? def get_data(self,url): ? ? ? ? response = requests.get(url,headers=self.headers) ? ? ? ? with open("temp.html","wb") as f: ? ? ? ? ? ? f.write(response.content) ? ? ? ? return response.content ? ? def parse_data(self,data): ? ? ? ? # 創(chuàng)建element對(duì)象 ? ? ? ? data = data.decode().replace("<!--","").replace("-->","") ? ? ? ? html =etree.HTML(data) ? ? ? ? el_list = html.xpath('//li[@class="j_thread_list clearfix"]/div/div[2]/div[1]/div[1]/a') ? ? ? ? #print(len(el_list)) ? ? ? ? data_list = [] ? ? ? ? for el in el_list: ? ? ? ? ? ? temp = {} ? ? ? ? ? ? temp['title'] = el.xpath("./text()")[0] ? ? ? ? ? ? temp['link'] = 'http://tieba.baidu.com' + el.xpath("./@href")[0] ? ? ? ? ? ? data_list.append(temp) ? ? ? ? # 獲取下一頁url ? ? ? ? try: ? ? ? ? ? ? next_url = 'https:' + html.xpath('//a[contains(text(),"下一頁"]/@href')[0] ? ? ? ? except: ? ? ? ? ? ? next_url = None ? ? ? ? return data_list,next_url ? ? def save_data(self,data_list): ? ? ? ? for data in data_list: ? ? ? ? ? ? print(data) ? ? def run(self): ? ? ? ? # url ? ? ? ? # headers ? ? ? ? next_url = self.url ? ? ? ? while True: ? ? ? ? ? ? # 發(fā)送請(qǐng)求,獲取響應(yīng) ? ? ? ? ? ? data = self.get_data(self.url) ? ? ? ? ? ? # 從響應(yīng)中提取數(shù)據(jù)(數(shù)據(jù)和翻頁用的url) ? ? ? ? ? ? data_list,next_url = self.parse_data(data) ? ? ? ? ? ? self.save_data(data_list) ? ? ? ? ? ? print(next_url) ? ? ? ? ? ? # 判斷是否終結(jié) ? ? ? ? ? ? if next_url == None: ? ? ? ? ? ? ? ? break if __name__ == '__main__': ? ? tieba =Tieba("傳智播客") ? ? tieba.run()
8、lxml模塊中etree.tostring函數(shù)的使用
運(yùn)行下邊的代碼,觀察對(duì)比html
的原字符串和打印輸出的結(jié)果
from lxml import etree html_str = """<div<<ul> ? ? ? ? <li class="item-1"><a href="link1.html" rel="external nofollow" >first item</a></li> ? ? ? ? <li class="item-1"><a href="link2.html" rel="external nofollow" >second item</a></li> ? ? ? ? <li class="item-inactive"><a href="link3.html" rel="external nofollow" >third item</a></li> ? ? ? ? <li class="item-1"><a href="link4.html" rel="external nofollow" >fourth item</a></li> ? ? ? ? <li class="item=0"><a href="link5.html" rel="external nofollow" >fifth item</a> ? ? ? ? </ur></div> """ html = etree.HTML(html_str) handeled_html_str = etree.tostring(html).decode() print(handeled_html_str)
結(jié)論:
lxml.etree.HTML(html_str)
可以自動(dòng)補(bǔ)全標(biāo)簽;lxml.etree.tostring
函數(shù)可以將轉(zhuǎn)換位Element
對(duì)象再轉(zhuǎn)換回html字符串;- 爬蟲如果使用
lxml
來提取數(shù)據(jù),應(yīng)該以lxml.etree.tostring
的返回結(jié)果作為提取數(shù)據(jù)的依據(jù);
到此這篇關(guān)于Python數(shù)據(jù)提取-lxml模塊的文章就介紹到這了,更多相關(guān)Python -lxml模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyQt5簡(jiǎn)單讀取以及顯示圖片的應(yīng)用實(shí)例
我們?cè)谶M(jìn)行圖像處理時(shí),經(jīng)常會(huì)用到讀取圖片并顯示出來這樣的操作,下面這篇文章主要給大家介紹了關(guān)于PyQt5簡(jiǎn)單讀取以及顯示圖片應(yīng)用的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05利用python實(shí)現(xiàn)周期財(cái)務(wù)統(tǒng)計(jì)可視化
這篇文章主要給大家介紹了關(guān)于如何利用python實(shí)現(xiàn)周期財(cái)務(wù)統(tǒng)計(jì)可視化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python+django實(shí)現(xiàn)文件上傳
本系列以可操作性為主,介紹如何通過django web框架來實(shí)現(xiàn)一些簡(jiǎn)單的功能。每一篇文章都具有完整性和獨(dú)立性。使用新手在動(dòng)手做的過程中體會(huì)web開發(fā)的過程,過程中細(xì)節(jié)請(qǐng)參考相關(guān)文檔。2016-01-01Python安裝Flask環(huán)境及簡(jiǎn)單應(yīng)用示例
這篇文章主要介紹了Python安裝Flask環(huán)境及簡(jiǎn)單應(yīng)用,結(jié)合實(shí)例形式分析了Flask框架的安裝、以及路由、重定向、cookie等相關(guān)操作實(shí)現(xiàn)方法,需要的朋友可以參考下2019-05-05idea創(chuàng)建springMVC框架和配置小文件的教程圖解
本文通過圖文并茂的形式給大家介紹了idea創(chuàng)建springMVC框架和配置小文件的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-09-09pytorch Dataset,DataLoader產(chǎn)生自定義的訓(xùn)練數(shù)據(jù)案例
這篇文章主要介紹了pytorch Dataset, DataLoader產(chǎn)生自定義的訓(xùn)練數(shù)據(jù)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-03-03Python3實(shí)現(xiàn)發(fā)送QQ郵件功能(html)
這篇文章主要為大家詳細(xì)介紹了Python3實(shí)現(xiàn)發(fā)送QQ郵件功能,html格式的qq郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12關(guān)于Python使用turtle庫(kù)畫任意圖的問題
這篇文章主要介紹了Python turtle庫(kù)畫任意圖,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04