...

Python3解析HTML

lxml支持HTML及XML,解析速度快,兼容性强。使用方式和ElementTree比较像。

安装方法

$ pip install lxml

lxml节点对象常用方法:

  • xpath(): 使用XPath获取下级节点,结果为列表
  • text: 节点文本
  • itertext(): 迭代输出当前节点及下级所有节点文本,例如 ''.join(node.itertext()) 可以拿到节点中所有文本
  • attrib: 节点属性字典,如a节点 node.attrib['href']可以拿到其url

操作步骤

  • 第一步:使用etree.HTML()实例化得到根节点,实例化时会自动补全HTML代码。
from lxml import etree
html = '''
<div id="content">
    <ul>
        <li id="top_001" class="item">肖申克的救赎<li>
        <li id="top_001" class="item">霸王别姬</li>
        <li id="top_002" class="item">阿甘正传</li>
    </ul>
</div>
'''
root = etree.HTML(html) 
  • 第二步:使用root.xpath()查找节点。

不同于xml.etree.ElementTree中只支持部分的XPath语法,root.xpath()中支持使用完整的XPath语法,路径不需要使用“.”开始,root.xpath()方法返回查找到的所有节点列表,示例如下:

root.xpath('/html/body/div'):绝对路径查找
root.xpath('//ul/li[2]') :相对路径,结合索引
root.xpath('//div[@id="content"]'):结合属性查找
root.xpath('//li[@id="top_001" and @class="item"]'):多条件查找
root.xpath('//li[text()="阿甘正传"]'):使用text()函数根据元素文本查找
root.xpath('//li[contains(text(), "阿甘")]'):使用contains函数查找文本包含
root.xpath('//li[1]/following-sibling::li'):使用XPath的轴方法获取后面所有的同级元素

如果想要获取节点是属性或文本等,可以从返回的节点列表中取出节点,并使用.tag、.text或.attrib获取节点的标签、文本或属性字典,也可以直接在XPath语句中使用/@attribute或/text来获取属性,示例如下:

div = root.xpath('//div')[0] 
print(div.attrib)
print(root.xpath('//div/@id'))
print(root.xpath('//ul/li[last()]/text()'))

由于root.xpath()方法返回节点列表,这里去第一个元素,并打印其属性字典。第三行直接使用XPath表达式取相应节点的id属性,返回属性列表。第四行使用XPath表达式text()函数取节点的文本,返回文本列表,打印结果如下:

{'id': 'content'}
['content']
['阿甘正传']
posted @ 2022-04-09 11:27  韩志超  阅读(808)  评论(0编辑  收藏  举报