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()獲取標簽內的文字信息