python筆記27-lxml.etree解析html
阿新 • • 發佈:2019-01-26
js xml lis 簡單 ddl 代碼量 all 想要 print set
之前分享過一個python爬蟲beautifulsoup框架可以解析html頁面,最近看到lxml框架的語法更簡潔,學過xpath定位的,可以立馬上手。
使用環境:
python 3.6
lxml 4.2.4
lxml安裝
使用pip安裝lxml庫
$ pip install lxml
pip show lxml查看版本號
$ pip show lxml
html解析
這裏用到etree.HTML方法把html的文本內容解析成html對象
要打印html內容,可以用etree.tostring方法,encoding="utf-8"參數可以正常輸出html裏面的中文內容。pretty_print=True是以標準格式輸出
# coding:utf-8
from lxml import etree
htmldemo = ‘‘‘
<meta charset="UTF-8"> <!-- for HTML5 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<html><head><title>yoyo ketang</title></head>
<body>
<b><!--Hey, this in comment!--></b>
<p class="title"><b>yoyoketang</b></p>
<p class="yoyo">這裏是我的微信公眾號:yoyoketang
<a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister" id="link1">fiddler教程</a>,
<a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python筆記</a>,
<a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium文檔</a>;
快來關註吧!</p>
<p class="story">...</p>
‘‘‘
# etree.HTML解析html內容
demo = etree.HTML(htmldemo)
# 打印解析內容str
t = etree.tostring(demo, encoding="utf-8", pretty_print=True)
print(t.decode("utf-8"))
運行結果
<html>
<head><meta charset="UTF-8"/> <!-- for HTML5 -->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>yoyo ketang</title>
</head>
<body>
<b><!--Hey, this in comment!--></b>
<p class="title"><b>yoyoketang</b></p>
<p class="yoyo">這裏是我的微信公眾號:yoyoketang
<a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister" id="link1">fiddler教程</a>,
<a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python筆記</a>,
<a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium文檔</a>;
快來關註吧!</p>
<p class="story">...</p>
</body>
</html>
soupparser解析器
soupparser解析器比上面的etree.HTML容錯性要好一點,因為其處理不規範的html的能力比etree強太多。
import lxml.html.soupparser as soupparser
demo = soupparser.fromstring(htmldemo)
t = etree.tostring(demo, encoding="utf-8", pretty_print=True)
print(t.decode("utf-8"))
xpath使用案例
使用htnl解析器,最終是想獲取html上的某些元素屬性和text文本內容,接下來看下,用最少的代碼,簡單高效的找出想要的內容。
比如要獲取“這裏是我的微信公眾號:yoyoketang”
# coding:utf-8
from lxml import etree
htmldemo = ‘‘‘
復制上面的html內容
‘‘‘
# etree.HTML解析html內容
demo = etree.HTML(htmldemo)
nodes = demo.xpath(‘//p[@class="yoyo"]‘)
# 獲取文本
t = nodes[0].text
print(t)
運行結果:
這裏是我的微信公眾號:yoyoketang
從代碼量上看,簡單的三行代碼就能找到想要的內容了,比之前的beautifulsoup框架要簡單高效的多
nodes是xpath定位獲取到的一個list對象,會找出所有符合條件的元素對象。可以用for 循環查看詳情
# coding:utf-8
from lxml import etree
htmldemo = ‘‘‘
復制上面的html內容
‘‘‘
# etree.HTML解析html內容
demo = etree.HTML(htmldemo)
nodes = demo.xpath(‘//p[@class="yoyo"]‘)
print(nodes) # list對象
for i in nodes:
# 打印定位到的內容
print(etree.tostring(i, encoding="utf-8", pretty_print=True).decode("utf-8"))
# 元素屬性,字典格式
print(i.attrib)
運行結果
[<Element p at 0x2bcd388>]
<p class="yoyo">這裏是我的微信公眾號:yoyoketang
<a href="http://www.cnblogs.com/yoyoketang/tag/fiddler/" class="sister" id="link1">fiddler教程</a>,
<a href="http://www.cnblogs.com/yoyoketang/tag/python/" class="sister" id="link2">python筆記</a>,
<a href="http://www.cnblogs.com/yoyoketang/tag/selenium/" class="sister" id="link3">selenium文檔</a>;
快來關註吧!</p>
{‘class‘: ‘yoyo‘}
二次查找
通過xpath定位語法//p[@class="yoyo"]定位到的是class="yoyo"這個元素以及它的所有子節點,如果想定位其中一個子節點,可以二次定位,繼續xpath查找,如獲取:python筆記
nodes = demo.xpath(‘//p[@class="yoyo"]‘)
t1 = nodes[0].xpath(‘//a[@id="link2"]‘)
print(t1[0].text)
運行結果
python筆記
python筆記27-lxml.etree解析html