Python?文檔解析lxml庫的使用詳解
1.lxml庫簡介
lxml 是 Python 常用的文檔解析庫,能夠高效地解析 HTML/XML 文檔,常用于 Python 爬蟲。
lxml 為第三方庫,需要我們通過pip命令安裝:
pip install lxml
2.lxml庫方法介紹
lxml 庫提供了一個(gè)
etree
模塊,該模塊專門用來解析 HTML/XML 文檔,讓我們先導(dǎo)入模塊:
from lxml import etree
使用
etree
模塊的HTML()
方法可以創(chuàng)建 HTML 解析對(duì)象:
from lxml import etree parse_html = etree.HTML(html)
HTML()
方法能夠?qū)?HTML 標(biāo)簽字符串解析為 HTML 文件,并且可以自動(dòng)修正 HTML 文本:
from lxml import etree html_str = ''' <div> <ul> <li><a href="www.python.org">Python</a></li> <li><a href="www.java.com">Java</a> <li><a href="www.csdn.net">CSDN</a></li> </ul> </div> ''' html = etree.HTML(html_str) # tostring()將標(biāo)簽元素轉(zhuǎn)換為字符串輸出,注意:result為字節(jié)類型 result = etree.tostring(html) print(result.decode('utf-8'))
上述代碼我故意在Java那一行少寫一個(gè)</li>,可以看到輸出會(huì)自動(dòng)補(bǔ)全:
<html><body><div> <ul> <li><a href="www.python.org">Python</a></li> <li><a href="www.java.com">Java</a></li> <li><a href="www.csdn.net">CSDN</a></li> </ul> </div> </body></html>
解析為 HTML 文件后,我們可以使用
xpath()
方法來提取我們需要的數(shù)據(jù)了:
from lxml import etree html_str = ''' <div> <ul> <li><a href="www.python.org">Python</a></li> <li><a href="www.java.com">Java</a></li> <li><a href="www.csdn.net">CSDN</a></li> </ul> </div> ''' html=etree.HTML(html_str) xpath_bds='//@href' r_list = html.xpath(xpath_bds) print(r_list)
xpath()
方法使用一個(gè)XPath
表達(dá)式作為參數(shù),上面那段程序提取出了頁面里的所有網(wǎng)址。
詳細(xì)的
XPath
表達(dá)式語法,請(qǐng)參見菜鳥教程:
https://www.runoob.com/xpath/xpath-syntax.html
3.代碼實(shí)例
lxml 庫在爬蟲中的使用大概就是這么多了,接下讓我們結(jié)合前一篇文章(Python 網(wǎng)頁請(qǐng)求:requests庫的使用),來寫一個(gè)普通的爬蟲程序吧:
import os import sys import requests from lxml import etree x = requests.get('https://www.csdn.net/') html = etree.HTML(x.text) xpath_bds = '//img/@src' img_list = html.xpath(xpath_bds) # 創(chuàng)建img文件夾 os.chdir(os.path.dirname(sys.argv[0])) if not os.path.exists('img'): os.mkdir('img') print('創(chuàng)建文件夾成功') else: print('文件夾已存在') # 下載圖片 for i in range(len(img_list)): img = requests.get(img_list[i]).content if img_list[i].endswith('.jpg'): with open(f'./img/{i}.jpg', 'wb') as f: f.write(img) elif img_list[i].endswith('.jpeg'): with open(f'./img/{i}.jpeg', 'wb') as f: f.write(img) elif img_list[i].endswith('.png'): with open(f'./img/{i}.png', 'wb') as f: f.write(img) else: print(f'第{i + 1}張圖片格式不正確') continue print(f'第{i + 1}張圖片下載成功')
這個(gè)爬蟲程序爬取了CSDN首頁的所有
.jpg
、.jpeg
、.png
格式的圖片,快來自己嘗試一下吧!
到此這篇關(guān)于Python 文檔解析lxml庫的使用的文章就介紹到這了,更多相關(guān)Python lxml庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python Pandas庫基礎(chǔ)分析之時(shí)間序列的處理詳解
這篇文章主要介紹了python Pandas庫基礎(chǔ)分析之時(shí)間序列的處理詳解,Pandas作為Python環(huán)境下的數(shù)據(jù)分析庫,更是提供了強(qiáng)大的日期數(shù)據(jù)處理的功能,是處理時(shí)間序列的利器,需要的朋友可以參考下2019-07-07Python實(shí)現(xiàn)解壓當(dāng)天創(chuàng)建的ZIP文件到指定文件夾中
這篇文章主要為大家詳細(xì)介紹了Python如何實(shí)現(xiàn)解壓當(dāng)天創(chuàng)建的ZIP文件到指定文件夾中,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下2024-03-03Python的條件語句與運(yùn)算符優(yōu)先級(jí)詳解
這篇文章主要介紹了Python的條件語句與運(yùn)算符優(yōu)先級(jí),是Python入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10python實(shí)現(xiàn)數(shù)據(jù)庫跨服務(wù)器遷移
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)數(shù)據(jù)庫之間的數(shù)據(jù)遷移,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04