写点什么

【Python 技能树共建】lxml 模块

作者:梦想橡皮擦
  • 2022 年 6 月 11 日
  • 本文字数:1256 字

    阅读完需:约 4 分钟

Python lxml 模块

lxml 库是一款 Python 数据解析库,参考重要文档在 https://lxml.de/,项目开源地址在:https://github.com/lxml/lxml,在一顿检索之后,发现 lxml 没有中文相关手册,不过好在英文文档阅读难度不大,我们可以直接进行学习。

怎么用

lxml.etree

纵览之前的博客内容,出场率最高的就是 lxml.etree ,其次就是 Element 对象,我们在解析数据的时候,大量的代码都是基于 Element 对象的 API 实现。


在爬虫代码采集过程中,通过 etree.HTML 直接将字符串实例化为 element 对象。



import requests
from lxml import etree
res = requests.get("http://www.jsons.cn/zt/")
html = res.text
root_element = etree.HTML(html)
print(root_element)
print(root_element.tag)
复制代码


上述代码输出内容如下所示:



<Element html at 0x3310508>
html
复制代码


其中需要注意的是 Element 后面的 html,该字符串表示对象的标签名为 html,如果使用下述代码:



print(root_element[1])
复制代码


上述内容得到的是 <Element body at 0x356e248>,即 body 标签,同样的操作可以使用子元素获取。



print("*"*100)
for child in root_element:
print(child.tag)
复制代码


上述代码输出的内容为:



head
body
复制代码


该输出表示在 html 标签中,只包含headbody 标签,实际情况也确实如此,为了验证,你可以在 循环中继续嵌套一层。


此时输出的内容就变得丰富了需求,如下图所示:




你也可以通过 etree.tostring(element对象) 直接将该对象转换为字符串进行输出。



for child in root_element:
for item in child:
print(item.tag)
print(etree.tostring(item))
复制代码

XPath

lxml 库可以配合其他的解析引擎进行工作,首次接触的就是 XPath,关于 XPath 相关的知识,我们后续博客会细化学习,本节课依旧从 lxml 的角度出发,为你介绍。


在爬虫代码编写中,直接使用 html.xpath("xpath表达式") 即可获取目标数据,例如获取网页 title。



print(root_element.xpath('//title'))
复制代码


获取网页所有文本:



print(root_element.xpath('string()'))
复制代码


获取到 element 对象之后,可调用 text 属性,获取对应文本,在使用的时候,需要注意使用 XPath 获取到的 element 对象,都是列表。



title_element = root_element.xpath('//title')
print(title_element[0].text)
复制代码


lxml 中,还内置了一款 简单的类似 XPath 的路径语言,称为 ElementPath,例如查询 title,需要从 head 开始检索,否则返回 None



print(root_element[0].find("title"))
复制代码


官方提供的方法如下:


  • iterfind(): 返回查找到的数据,迭代器形式返回;

  • findall(): 返回匹配到的列表;

  • find(): 返回第一个匹配到的数据;

  • findtext(): 返回匹配到的文本数据,第一个。

lxml 扩展知识

lxml 除了可以配合 XPath 实现数据解析外,还可以与 cssselectBeautifulSouphtml5lib 配合使用,这部分在后续的案例中,将逐步进行展开。


lxml 在爬虫领域,更多的是在提取数据,因此较于该库本身,掌握 XPath 等解析表达式的写法更加重要。


鉴于该库手册没有被翻译,后期可以尝试将其翻译为中文。

发布于: 刚刚阅读数: 4
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
【Python技能树共建】lxml 模块_Python_梦想橡皮擦_InfoQ写作社区