1. 程式人生 > 實用技巧 >10-python爬蟲之lxml庫

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,自己動手實踐

線上練習:https://www.520mg.com/it