4. 实例引入
- 实例代码如下:
from lxml import etree
text = '''
<div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</ul>
</div>
'''
html = etree.HTML(text)
result = etree.tostring(html)
print(result.decode('utf-8'))
- 首先导入lxml库的etree模块,然后声明了一段HTML文本,接着调用HTML类进行初始化,这样就构成了一个XPath解析对象。
- 此处需要注意一点,HTML文本中的最后一个li节点是没有闭合的,而etree模块可以自动修正HTML文本。
- 之后调用了tostring方法即可输出修正后的HTML代码,但是结果是bytes类型
- 于是利用decode方法将其转成str类型,结果如下:
<html><body><div>
<ul>
<li class="item-0"><a href="link1.html">first item</a></li>
<li class="item-1"><a href="link2.html">second item</a></li>
<li class="item-inactive"><a href="link3.html">third item</a></li>
<li class="item-1"><a href="link4.html">fourth item</a></li>
<li class="item-0"><a href="link5.html">fifth item</a>
</li></ul>
</div>
</body></html>
- 可以看到,经过处理之后的li节点标签得以补全,并且自动添加了body、html节点
- 另外,也可以不声明,直接读取文本文件进行解析,实例如下:
html = etree.parse("test.html",etree.HTMLParser())
result = etree.tostring(html)
print(result.decode('utf-8').replace('
',''))
-
- 这次输出结果略有不同,多了一个DOCTYPE声明,不过对解析无任何影响,接如果下:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><div>;
<ul>;
<li class="item-0"><a href="link1.html">first item</a></li>;
<li class="item-1"><a href="link2.html">second item</a></li>;
<li class="item-inactive"><a href="link3.html">third item</a></li>;
<li class="item-1"><a href="link4.html">fourth item</a></li>;
<li class="item-0"><a href="link5.html">fifth item</a>;
</li></ul>;
</div> </body></html>
-
扩展
-
etree模块的属性和方法的使用介绍
- 解析输入(字符串/文件 → 树)
![image]()
- Element 的核心属性(不是方法,不加括号)
![image]()
- 遍历与查找(最常用)
-
- xpath(expr) —— 最强大的查找方式,返回列表
-
- find() / findall() —— 用 ElementPath 语法(类似简易 XPath)
-
- 结构遍历
![image]()
- 结构遍历
-
- 解析输入(字符串/文件 → 树)
-
lxml.etree 模块 API 全景
![image]()
心揣信念,梦想就在脚下!





浙公网安备 33010602011771号