1. 程式人生 > >python筆記27-lxml.etree解析html

python筆記27-lxml.etree解析html

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