您的位置:首页 > 文旅 > 旅游 > 打卡学习Python爬虫第五天|Xpath解析的使用

打卡学习Python爬虫第五天|Xpath解析的使用

2024/12/23 16:24:32 来源:https://blog.csdn.net/weixin_52687711/article/details/141421694  浏览:    关键词:打卡学习Python爬虫第五天|Xpath解析的使用

什么是Xpath?是在XML文档中搜索内容的一门语言,HTML可以看作是xml的一个子集。

目录

1、安装lxml模块

2、导入lxml中的etree子模块

3、Xpath使用方法

3.1.选择节点

3.2.选择属性

3.3.选择文本内容

3.4.使用通配符*过滤节点

3.5.使用中括号[]索引

3.6.使用相对查找

3.7.使用函数

4、全部示例代码


1、安装lxml模块

# PyCharm终端输入
pip install lxml# 使用清华源
pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple

2、导入lxml中的etree子模块

from lxml import etree

etree.XML().xpath() 是Python中用于XML解析的库 lxml 中的一个函数。lxml 是一个高效的XML解析器。另外,可以使用etree.parse("文件名")读取文件进行解析。

具体来说:

  • etree 是 lxml 库中的一个模块,它提供了访问XML文档的接口。
  • XML() 是 etree 模块中的一个函数,用于解析XML字符串。
  • xpath() 是 etree 模块中的一个方法,用于执行XPath查询。

etree.XML().xpath() 的含义是将一个XML字符串解析为一个lxmletree对象,然后使用这个对象执行XPath查询。

3、Xpath使用方法

XPath表达式通常以 / 开头,/ 表示层级关系,第一个 / 是根节点。

XPath是一种用于在XML文档中定位元素的语言。可使用一系列的语法规则来指定哪些元素应该被选中。xpath() 方法接受一个XPath表达式作为参数,并返回一个包含匹配元素的列表。

若有以下xml文档内容:

xml = '''
<book><id>10010</id><name>蔬菜</name><price>33</price><author><nick id="1">萝卜</nick><nick id="2">豆腐</nick><nick class="a">土豆</nick><nick id="3">白菜</nick><div><nick>西红柿</nick></div><span><nick>番茄</nick></span></author><partner><nick id="4">火锅</nick><nick id="5">麻辣烫</nick></partner>
</book>
'''
3.1.选择节点

 使用///来选择节点。

  • /book/author/nick:选择/book/author的直接子节点nick
  • /book/author//nick:选择/book/author的所有名为nick子节点,不论它们在文档中的位置。
# text()为获取文本内容/book/author/nick/text()
/book/author//nick/text()

3.2.选择属性

使用 @来选择元素的属性,如nick节点中的id属性且值为1。

/book/author/nick[@id=1]/text()

 如果想要属性的值

# 得到第i个id的值
/book/author/nick[i]/@id# 得到全部id的值
/book/author/nick/@id

3.3.选择文本内容

使用 text() 来选择节点的文本内

//book/name/text()

3.4.使用通配符*过滤节点

使用通配符 * 表示任意的节点。

/book/author/*/nick/text()# 相当于*代替了div和span,也就是说author和span之间可以是任意字符
/book/author/div/nick/text()
/book/author/span/nick/text()

3.5.使用中括号[]索引

获取/book/author下众多nick中的第一个nick,最后一个nick[last()]

/book/author/nick[1]/text()# 最后一个
/look/author/nick[last()]/text()

3.6.使用相对查找

先提取/book中每一个partner的信息,然后在partner中继续查找,./为当前节点,即partner节点

# 相对路径查询
result = tree.xpath("/book/partner")
for i in result:result1 = i.xpath("./nick/text()") #print(result1)

3.7.使用函数

函数可以用于计算或提取信息。

/book/author/nick[position()=2]/text()
# nick[position()=2]相当于nick[2]
/book/author/nick[2]/text()

count(//nick) # 获取nick节点的数量

4、全部示例代码

from lxml import etree
xml = '''
<book><id>10010</id><name>蔬菜</name><price>33</price><author><nick id="1">萝卜</nick><nick id="2">豆腐</nick><nick class="a">土豆</nick><nick id="3">白菜</nick><div><nick>西红柿</nick></div><span><nick>番茄</nick></span></author><partner><nick id="4">火锅</nick><nick id="5">麻辣烫</nick></partner>
</book>
'''
tree = etree.XML(xml) # 解析xml
# result = tree.xpath("/book")  # 获取根节点
# result = tree.xpath("/book/name")  # 获取子节点name
# result = tree.xpath("/book/name/text()") # 获取子节点name的文本内容
# result = tree.xpath("/book/author/nick/text()")  # 获取author的子nick节点的文本内容
# result1 = tree.xpath("/book/author//nick/text()") # 获取author节点下名为的所有nick节点的文本内容
# result = tree.xpath("/book/author/nick[@id=1]/text()") # 获取id=1的nick节点的文本内容
# result = tree.xpath("/book/author/*/nick/text()") # 获取author节点下所有nick节点的文本内容
# result = tree.xpath("/book/author/nick[1]/text()") # 获取author节点下第一个nick节点的文本内容
# result = tree.xpath("/book/author/nick/@id") # 获取author节点下所有nick节点的id属性值# 相对路径查询
# result = tree.xpath("/book/partner")
# for i in result:
#     result1 = i.xpath("./nick/text()") #
#     print(result1)# result = tree.xpath("count(//nick)") # 获取nick节点的数量
result = tree.xpath("/book/author/nick[position()=2]/text()") # 获取author节点下第二个nick节点的文本内容
print(result)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com