10-python爬蟲之lxml庫
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,自己動手實踐