原文链接:/yoyoketang/p/
element和elementtree参考:/hellocsz/article/details/79780654
英文使用说明:/
lxml安装
使用pip安装lxml库
$ pip install lxml
pip show lxml查看版本号
$ pip show lxml
html解析
方法把html的文本内容解析成html对象,并对HTML文本进行自动修正。
打印html内容,可以用方法,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="/yoyoketang/tag/fiddler/" class="sister" >fiddler教程</a>,
<a href="/yoyoketang/tag/python/" class="sister" >python笔记</a>,
<a href="/yoyoketang/tag/selenium/" class="sister" >selenium文档</a>;
快来关注吧!</p>
<p class="story">...</p>
'''
# 解析html内容
demo = (htmldemo)
# 打印解析内容str
t = (demo, encoding="utf-8", pretty_print=True)
print(("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="/yoyoketang/tag/fiddler/" class="sister" >fiddler教程</a>,
<a href="/yoyoketang/tag/python/" class="sister" >python笔记</a>,
<a href="/yoyoketang/tag/selenium/" class="sister" >selenium文档</a>;
快来关注吧!</p>
<p class="story">...</p>
</body>
</html>
解析 XML 字符串
网页下载下来以后是个字符串的形式,使用(str)构造一个 etree._ElementTree对象,使用 (t)返回一个字符串
>>> xml_string = '<root><foo class="foo zoo">Foo</foo><bar>中文</bar><baz></baz></root>'
>>> root = (xml_string.encode('utf-8')) # 最好传 byte string
>>> (root)
#默认返回的是 byte string
b'<root>root content<foo class="foo zoo">Foo</foo><bar>Bar</bar><baz/></root>'
>>> print((root, pretty_print=True).decode('utf-8'))
#decode 一下变成 unicode
<root>
<foo class="foo zoo">Foo</foo>
<bar>Bar</bar>
<baz/> # 注意这里没有子节点的 baz 节点被变成了自闭和的标签
</root>
>>> type(root)
<class '._Element'>
#可以看出 tostring 返回的是一个_Element类型的对象,也就是整个 xml 树的根节点
xpath使用案例
使用htnl解析器,最终是想获取html上的某些元素属性和text文本内容,接下来看下,用最少的代码,简单高效的找出想要的内容。
比如要获取“这里是我的微信公众号:yoyoketang”
# coding:utf-8
from lxml import etree
htmldemo = '''
复制上面的html内容
'''
# 解析html内容
demo = (htmldemo)
nodes = ('//p[@class="yoyo"]')
# 获取文本
t = nodes[0].text
print(t)
运行结果:
这里是我的微信公众号:yoyoketang
从代码量上看,简单的三行代码就能找到想要的内容了,比之前的beautifulsoup框架要简单高效的多
nodes是xpath定位获取到的一个list对象,会找出所有符合条件的元素对象。可以用for 循环查看详情
#coding:utf-8
from lxml import etree
htmldemo = '''
复制上面的html内容
'''
# 解析html内容
demo = (htmldemo)
nodes = ('//p[@class="yoyo"]')
print(nodes) # list对象
for i in nodes:
# 打印定位到的内容
print((i, encoding="utf-8", pretty_print=True).decode("utf-8"))
# 元素属性,字典格式
print()
运行结果
[<Element p at 0x2bcd388>]
<p class="yoyo">这里是我的微信公众号:yoyoketang
<a href="/yoyoketang/tag/fiddler/" class="sister" >fiddler教程</a>,
<a href="/yoyoketang/tag/python/" class="sister" >python笔记</a>,
<a href="/yoyoketang/tag/selenium/" class="sister" >selenium文档</a>;
快来关注吧!</p>
{'class': 'yoyo'}
二次查找
通过xpath定位语法//p[@class=“yoyo”]定位到的是class="yoyo"这个元素以及它的所有子节点,如果想定位其中一个子节点,可以二次定位,继续xpath查找,如
nodes = ('//p[@class="yoyo"]')
t1 = nodes[0].xpath('//a[@]')
print(t1[0].text)
运行结果
python笔记