lxml 是一種使用 Python 撰寫的庫,可以迅速、靈活地處理 XML ,支持 XPath (XML Path Language)
lxml python 官方檔案 http://lxml.de/index.html
學習目的
利用上節課學習的XPath語法,來快速的定位 特定元素以及節點資訊,目的是 提取出 HTML、XML 目標資料
如何安裝
- Ubuntu :
sudo apt-get install libxml2-dev libxslt1-dev python-dev
sudo apt-get install zlib1g-dev
sudo apt-get install libevent-dev
sudo pip install lxml
利用 pip 安裝即可
- Windows:
http://blog.csdn.net/g1apassz/article/details/46574963
http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
初步使用
首先我們利用lxml來決議 HTML 代碼,先來一個小例子來感受一下它的基本用法,
使用 lxml 的 etree 庫,然后利用 etree.HTML 初始化,然后我們將其列印出來,
from lxml import etree
text ='''
<div>
<ul>
<li class="item-0"><a href="link1.html">第一項</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html"><span class="bold">third item</span></a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
#把字串決議為html檔案
html = etree.HTML(text)
#將元素序列化為其XML樹的字串表示形式
result = etree.tostring(html)
print (result)
所以輸出結果是這樣的
<html><body><div>
<ul>
<liclass="item-0"><ahref="link1.html">第一項</a></li>
<liclass="item-1"><ahref="link2.html">second item</a></li>
<liclass="item-inactive"><ahref="link3.html"><spanclass="bold">third item</span></a></li>
<liclass="item-1"><ahref="link4.html">fourth item</a></li>
<liclass="item-0"><ahref="link5.html">fifth item</a>
</li></ul>
</div>
</body></html>
不僅補全了 li 標簽,還添加了 body,html 標簽,
XPath實體測驗
**1. 獲取所有的 **<li> 標簽
print type(html)
result = html.xpath('//li')
print (result)
print (len(result))
print (type(result))
print (type(result[0]))
運行結果
<type'lxml.etree._ElementTree'>
[<Elementliat 0x1014e0e18>, <Elementliat 0x1014e0ef0>, <Elementliat 0x1014e0f38>, <Elementliat 0x1014e0f80>, <Elementliat 0x1014e0fc8>]
5
<type'list'>
<type'lxml.etree._Element'>
可見,每個元素都是 Element 型別;是一個個的標簽元素,類似現在的實體
<Elementliat 0x1014e0e18>
Element型別代表的就是
<li class="item-0"><ahref="link1.html">第一項</a></li>
[注意]
Element型別是一種靈活的容器物件,用于在記憶體中存盤結構化資料,
每個element物件都具有以下屬性:
1. tag:string物件,標簽,用于標識該元素表示哪種資料(即元素型別),
2. attrib:dictionary物件,表示附有的屬性,
3. text:string物件,表示element的內容,
4. tail:string物件,表示element閉合之后的尾跡,
示例
<tag attrib1=1>text</tag>tail1 2 3 4
result[0].tag #li
2. 獲取 <li> 標簽的所有 class
html.xpath('//li/@class')
運行結果
['item-0', 'item-1', 'item-inactive', 'item-1', 'item-0']
3.獲取 <li> 標簽下屬性 href 為 link1.html 的 <a> 標簽
html.xpath('//li/a[@href="link1.html"]')
運行結果
[<Element a at 0x10ffaae18>]
4.獲取 <li> 標簽下的所有 <span>** 標簽**
注意這么寫是不對的
html.xpath('//li/span')
因為 / 是用來獲取子元素的,而 <span> 并不是 <li> 的子元素,所以,要用雙斜杠
html.xpath('//li//span')
運行結果
[<Element span at 0x10d698e18>]
5. 獲取 <li> 標簽下的所有 class,不包括 <li>
html.xpath('//li/a//@class')
運行結果
['blod']
**6. 獲取最后一個 **<li> 的<a> 的 href
html.xpath('//li[last()]/a/@href')
運行結果
['link5.html']
7. 獲取 class 為 bold 的標簽名
result = html.xpath('//*[@class="bold"]')print result[0].tag
運行結果
span
通過以上實體的練習,相信大家對 XPath 的基本用法有了基本的了解
實戰專案
豆瓣電影排行榜

https://movie.douban.com/chart
from lxml import etree
import urllib.parse
import urllib.request
url='https://movie.douban.com/chart'
# 豆瓣排行榜
herders={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', 'Referer':'https://movie.douban.com/','Connection':'keep-alive'}
# 請求頭資訊
req = urllib.request.Request(url,headers=herders)
# 設定請求頭
response=urllib.request.urlopen(req)
# response 是回傳回應的資料
htmlText=response.read()
# 讀取回應資料
# 把字串決議為html檔案
html = etree.HTML(htmlText)
result = html.xpath('//div[@class="pl2"]/a')
# 決議到所有的標題
file = open('data.txt','a+',encoding='utf-8')
# 打開一個文本檔案
for line in result:
file.write(line.xpath('string(.)').replace('\n','').replace(' ','')+'\n')
# 遍歷決議到的結果
# 獲取里面的文字.移除換行.替換空格+換行
file.close()
結果
data.txt
從邪惡中拯救我/魔鬼對決(臺)/請救我于邪惡
神棄之地/惡魔每時每刻
監視資本主義:智能陷阱/社交困境/智能社會:進退兩難(臺)
我想結束這一切/i’mthinkingofendingthings(風格化標題)
禁錮之地/Imprisonment/TheTrapped
鳴鳥不飛:烏云密布/SaezuruToriWaHabatakanai:TheCloudsGather
樹上有個好地方/TheHomeintheTree
辣手保姆2:女王蜂/撒旦保姆:血腥女王/TheBabysitter2
凍結的希望/雪藏希望:待日重生/HopeFrozen:AQuestToLiveTwice
鐵雨2:首腦峰會/鐵雨2:首腦會談/鋼鐵雨2:核戰危機(港)
單詞表
"""
單詞表
parse 決議
request 請求
headers 請求頭
result 結果
file 檔案
encoding 編碼
write 寫
open 打開
string 文本
replace 替換
"""
作業
(1)練習一下lxml、etree、xpath的整個的操作
(2)試試上節課XPath的語法以及Html,自己動手實踐
在線練習:https://www.520mg.com/it

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/139211.html
標籤:AI
