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('&#13',''))
    • 这次输出结果略有不同,多了一个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
    • 遍历与查找(最常用)
        1. xpath(expr) —— 最强大的查找方式,返回列表
        1. find() / findall() —— 用 ElementPath 语法(类似简易 XPath)
        1. 结构遍历
          image
  • lxml.etree 模块 API 全景
    image

posted @ 2026-09-26 19:55  abner_pan  阅读(2)  评论(0)    收藏  举报