Python爬蟲之Lxml庫與Xpath語法


Lxml庫是基於lbxml2的XML解析庫的Python封裝。

作用:使用Xpath語法解析定位網頁數據。

LXMl庫的安裝與使用方法

Lxml庫的安裝

windows系統下的安裝:
復制代碼
#pip安裝
pip3 install lxml

#wheel安裝
#下載對應系統版本的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
pip3 install lxml-4.2.1-cp36-cp36m-win_amd64.whl
復制代碼
linux下安裝:
yum install -y epel-release libxslt-devel libxml2-devel openssl-devel

pip3 install lxml
 
 

 Lxml庫使用

修正HTML代碼

Lxml為XML的解析庫,很好的支持了HTML文檔的解析功能。

from lxml import etree
text="""
one
"""
html1=etree.HTML(text)
print(html1)

etree庫把HTML文檔解析為Element對象,可以通過以下代碼輸出解析過的HTML文檔

from lxml import etree
text="""
one
"""
html1=etree.HTML(text)
print(html1)
result=etree.tostring(html1)
print(result)

通過運行程序我們可以看出,Lxml庫自動補全了HTML代碼。

 
讀取HTML文件

通過PyCharm新建一個.html文件

<!DOCTYPE html>
<html lang="en">
<head>
<title>flower</title>
</head>
<body>
one
</body>
</html>
from lxml import etree
html1=etree.parse('flower.html')
result=etree.tostring(html1,pretty_print=True)
print(result)

 

解析HTML文件
import requests
from lxml import etree
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362'
}
res=requests.get('https://book.douban.com/',headers=headers)
html=etree.HTML(res.text)
result=etree.tostring(html)
print(result)

Xpath語法

節點關系

父節點

每個元素及其屬性都有一個父節點,例如

<user>
     <name>xiao ming</name>
     <sex>JK. Rowling</sex>
     <id>34</id>
     <goal>89</goal>
</user>

其中user元素為name,sex,id,goal元素的父節點

子節點

元素節點可有0個,一個,或者多個自節點,在上述例子中name,sex,id,goal為user的子節點。

同胞節點

name,sex,id,goal互為同胞節點,即同胞節點有相同的父親節點

先輩節點

先輩節點為某元素的父節點和父節點的父節點

后代節點

某節點的子節點和子節點的子節點

節點選擇

Xpath使用路徑表達式在XML文檔中選取節點,節點是通過沿着路徑或者step來選取的

 

使用技巧

 

 

import requests
from lxml import etree
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400'
}
#//*[@id="content"]/div/div[1]/div[1]/div[2]/div/div/ul[2]/li[1]/div[1]/a/img
res=requests.get('https://book.douban.com',headers=headers)
selector=etree.HTML(res.text)
img=selector.xpath('//*[@id="content"]/div/div[1]/div[4]/div[2]/ul/li[1]/div[2]/h4/a/text()')[0]
print(img)

通過/text()獲取標簽內的文字信息

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM