前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python-数据解析-lxml库-下

Python-数据解析-lxml库-下

作者头像
小团子
发布2019-07-18 15:11:45
6000
发布2019-07-18 15:11:45
举报
文章被收录于专栏:数据云团数据云团数据云团
from lxml import etree

一、ElementPath 类

ElementTree 类中附带了一个类似于 XPath 路径语言的 ElementPath 类。

3个常用的方法,可以满足大部分搜索和查询需求,并且这3个方法的参数都是 XPath 语句。

  • find() 方法:

返回匹配到的第一个子元素。

  • findall() 方法:

以列表的形式返回所有匹配的子元素。

  • iterfind() 方法:

返回一个所有匹配元素的迭代器。

从文档树的根节点开始,搜索符合要求的节点。

# 从字符串中解析 XML,返回根节点
root = etree.XML("<root><a x="123">aText</a></root>")

# 从根节点查找,返回匹配到的节点名称
print(root.find('a').tag)

# 从根节点开始查找,返回匹配到的第一个节点的名称
print(root.findall("./a[@x]")[0].tag)

还可以调用 xpath() 方法,使用元素作为上下文节点来评估 XPath 表达式。

二、lxml 库的使用

示例

<!-- hello.html -->
<div>
  <ul>
    <li class="item-0"><a href="1.html">first item</a></li>
    <li class="item-1"><a href="2.html">second item</a></li>
    <li class="item-inactive"><a href="3.html"><span class="bold">third item</span></a></li>
    <li class="item-1"><a href="4.html">fourth item</a></li>
    <li class="item-0"><a href="5.html">fifth item</a></li>
  </ul>
</div>

使用 lxml 库中的路径表达式技巧,通过调用 xpath() 方法匹配选取的节点。

① 获取任意位置的 li 节点

可以直接使用 “//” 从任意位置选取节点 li,路径表达式:

//li

通过 lxml.etree 模块的 xpath() 方法,将 hello.html 文件中与该路径表达式匹配到的列表返回。

from lxml import etree
html = etree.parse("hello.html")

# 查找所有的 li 节点
result = html.xpath("//li")

# 打印 <li> 标签的元素集合
print(result)

# 打印 <li> 标签的个数
print(len(result))

# 打印返回结果的类型
print(type(result))

# 打印第一个元素的类型
print(type(result[0]))

② 获取 <li> 标签的 class 属性

使用 “/” 向下选取节点,并使用 @ 选取 class 属性节点。

//li/@class

获取 <li> 标签的 class 属性

from lxml import etree
html = etree.parse("hello.html")

# 查找位于 li 标签的 class 属性
result = html.xpath("//li/@class")
print(result)

③ 获取倒数第二个元素的内容

从任意位置开始选取倒数第二个 <li> 标签,再向下选取标签 <a>,获取该标签中的文本。

//li[last()-1]/a

或者

//li[last()-1]/a]/text()

第一个表达式需要访问 text 属性,才能拿到标签的文本,而第二个表达式可直接获取文本。

使用第一个路径表达式

from lxml import etree
html = etree.parse("hello.html")

# 获取倒数第二个元素的内容
result = html.xpath("//li[last()-1]/a")
print(result[0].text)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档