【Python 技能树共建】lxml 模块
Python lxml 模块
lxml
库是一款 Python 数据解析库,参考重要文档在 https://lxml.de/,项目开源地址在:https://github.com/lxml/lxml,在一顿检索之后,发现 lxml
没有中文相关手册,不过好在英文文档阅读难度不大,我们可以直接进行学习。
怎么用
lxml.etree
纵览之前的博客内容,出场率最高的就是 lxml.etree
,其次就是 Element
对象,我们在解析数据的时候,大量的代码都是基于 Element
对象的 API 实现。
在爬虫代码采集过程中,通过 etree.HTML
直接将字符串实例化为 element
对象。
上述代码输出内容如下所示:
其中需要注意的是 Element 后面的 html,该字符串表示对象的标签名为 html
,如果使用下述代码:
上述内容得到的是 <Element body at 0x356e248>
,即 body 标签,同样的操作可以使用子元素获取。
上述代码输出的内容为:
该输出表示在 html
标签中,只包含head
与 body
标签,实际情况也确实如此,为了验证,你可以在 循环中继续嵌套一层。
此时输出的内容就变得丰富了需求,如下图所示:

你也可以通过 etree.tostring(element对象)
直接将该对象转换为字符串进行输出。
XPath
lxml 库可以配合其他的解析引擎进行工作,首次接触的就是 XPath
,关于 XPath 相关的知识,我们后续博客会细化学习,本节课依旧从 lxml
的角度出发,为你介绍。
在爬虫代码编写中,直接使用 html.xpath("xpath表达式")
即可获取目标数据,例如获取网页 title。
获取网页所有文本:
获取到 element 对象之后,可调用 text
属性,获取对应文本,在使用的时候,需要注意使用 XPath
获取到的 element 对象,都是列表。
在 lxml
中,还内置了一款 简单的类似 XPath 的路径语言,称为 ElementPath
,例如查询 title,需要从 head
开始检索,否则返回 None
。
官方提供的方法如下:
iterfind()
: 返回查找到的数据,迭代器形式返回;findall()
: 返回匹配到的列表;find()
: 返回第一个匹配到的数据;findtext()
: 返回匹配到的文本数据,第一个。
lxml 扩展知识
lxml
除了可以配合 XPath
实现数据解析外,还可以与 cssselect
,BeautifulSoup
,html5lib
配合使用,这部分在后续的案例中,将逐步进行展开。
lxml
在爬虫领域,更多的是在提取数据,因此较于该库本身,掌握 XPath
等解析表达式的写法更加重要。
鉴于该库手册没有被翻译,后期可以尝试将其翻译为中文。
版权声明: 本文为 InfoQ 作者【梦想橡皮擦】的原创文章。
原文链接:【http://xie.infoq.cn/article/5ef5fd5c7c10992ad252e2da4】。文章转载请联系作者。
评论