python之lxml.etree解析HTML

原文链接https://www.cnblogs.com/yoyoketang/p/9661273.html
element和elementtree参考:https://blog.csdn.net/hellocsz/article/details/79780654
lxml.etree英文使用说明:https://lxml.de/tutorial.html

lxml安装

使用pip安装lxml库

$ pip install lxml

pip show lxml查看版本号

$ pip show lxml

html解析

etree.HTML方法把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>

解析 XML 字符串

网页下载下来以后是个字符串的形式,使用etree.fromstring(str)构造一个 etree._ElementTree对象,使用 etree.tostring(t)返回一个字符串

>>> xml_string = '<root><foo id="foo-id" class="foo zoo">Foo</foo><bar>中文</bar><baz></baz></root>'
>>> root = etree.fromstring(xml_string.encode('utf-8')) # 最好传 byte string
 
>>> etree.tostring(root)
#默认返回的是 byte string
b'<root>root content<foo id="foo-id" class="foo zoo">Foo</foo><bar>Bar</bar><baz/></root>'
 
>>> print(etree.tostring(root, pretty_print=True).decode('utf-8'))
#decode 一下变成 unicode
<root>
  <foo id="foo-id" class="foo zoo">Foo</foo>
  <bar>Bar</bar>
  <baz/> # 注意这里没有子节点的 baz 节点被变成了自闭和的标签
</root>
 
>>> type(root)
<class 'lxml.etree._Element'>

#可以看出 tostring 返回的是一个_Element类型的对象,也就是整个 xml 树的根节点

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查找,如

nodes = demo.xpath('//p[@class="yoyo"]')

t1 = nodes[0].xpath('//a[@id="link2"]')
print(t1[0].text)

运行结果

python笔记
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值