02 Python网络爬虫Xpath模块

XPath是一种用于在XML文档中定位节点的查询语言,XPath模块则是指用于解析和查询XML文档中XPath表达式的工具或库。

XPath模块通常由编程语言或应用程序提供,例如Java中的XPath API,Python中的lxml库,或者在浏览器中使用JavaScript的XPath实现等。通过使用XPath模块,可以方便地在XML文档中找到所需的数据或节点,使得XML文档的处理更加高效和便捷。

在Python中,我们可以使用许多XPath模块来处理XML文档,例如lxml、xml.etree.ElementTree、xml.dom等。其中,lxml是最常用的XPath模块之一,因为它非常高效且易于使用。

要使用lxml模块,首先需要安装它。可以通过使用pip包管理器来安装它,使用命令

pip install lxml

将会使用到的Book案例代码:

<?xml version="1.0" encoding="utf-8" ?>
<!--存储书店书籍列表-->
<bookstore>
    <book category="cooking">
        第一本:舌尖上的中国
        <title lang="en">美味生活</title>
        <author>李国瑞</author>
        <year>2016</year>
        <price>16.80</price>
    </book>
     <book category="children" lang="en">
        第二本:大脑中的动物
        <title lang="en">海底总动员</title>
        <author>周天昊</author>
        <year>2018</year>
        <price>36.80</price>
    </book>
     <book category="web">
        第三本:web前端一站式开发
        <title lang="en">疯狂的web前端</title>
        <author>王科</author>
         <author>王石</author>
         <author>王天一</author>
         <author>王启强</author>
        <year>2022</year>
        <price>76.80</price>
    </book>

     <book category="web" cover="paperback">
        第四本:JS教程
        <title lang="en">JavaScript基础教程</title>
        <author>李瀚文</author>
        <year>2023</year>
        <price>38.80</price>

    </book>

</bookstore>

1.选取节点

'''
01-XPath模块-选取节点
'''
from lxml import etree

# 将book.xml解析成HTML DOM模型
htmlDom = etree.parse("book.xml")

# <lxml.etree._ElementTree object at 0x000001BD24F422C0>
print(htmlDom)

# 1.获取所有的book节点
 result = htmlDom.xpath("book")
# [<Element book at 0x21b07832c00>,
# <Element book at 0x21b07832e00>,
# <Element book at 0x21b07832f00>,
# <Element book at 0x21b07832ec0>]
 print("1.所有的book节点:",result)

# 循环遍历每个节点对象
 for element in result:
     # 1.1 遍历节点的标签名称
     print("1.1 标签名称:",element.tag)
     # 1.2 遍历子节点的文本
     print("1.2 标签文本:",element.text)
     # 1.3 遍历子节点的属性
     print("1.3 标签属性:",element.attrib)

'''2.从根节点开始'''
# [<Element bookstore at 0x243e8a72340>]
result = htmlDom.xpath("/bookstore")
print("2.从根节点开始:",result)

'''3.获取所有book的节点 //book'''
result = htmlDom.xpath("//book")
print("3.获取所有book的节点:",result)

'''4.获取bookstore中所有book子节点 /bookstore/book'''
result = htmlDom.xpath("/bookstore/book")
print("4.获取bookstore中的book子节点:",result)

'''5.获取所有的属性 //@'''
result = htmlDom.xpath("//@category")
print("5.获取节点属性名为category的:",result)

2.谓语

'''
02-XPath模块-谓语
'''
from lxml import etree

# 转换
htmlDom = etree.parse("book.xml")

# 1.获取bookstore子元素的 第一个元素
result = htmlDom.xpath("/bookstore/book[1]")
print("1.获取bookstore子元素的第一个元素:",result[0].text)

# 2.获取bookstore子元素的最后一个元素
result = htmlDom.xpath("/bookstore/book[last()]")
print("2.获取bookstore子元素的最后一个元素:",result[0].text)

# 3.获取bookstore子元素的倒数第二个元素
result = htmlDom.xpath("/bookstore/book[last()-1]")
print("3.获取bookstore子元素的倒数第二个元素:",result[0].text)

# 4.获取bookstore子元素的前两个元素
result = htmlDom.xpath('/bookstore/book[position()<3]')
print("4.获取bookstore子元素的前两个元素:",result)

# 5.获取属性名为lang的title元素
result = htmlDom.xpath("//title[@lang]")
print("5.获取属性名为lang的title元素:",result)

# 6.获取属性名为lang的title元素且值为en
result = htmlDom.xpath("//title[@lang='en']")
print("6.获取属性名为lang且值为en的title元素:",result)

# 7.获取bookstore中所有的book元素且price大于35.00
result = htmlDom.xpath("/bookstore/book[price>35.00]")
print("7.获取bookstore中所有的book元素且price大于35.00:",result)

# 8.获取bookstore中所有book元素且price大于35.00的title元素
result = htmlDom.xpath("/bookstore/book[price>35.00]/title")
print("8.获取bookstore中所有book元素且price大于35.00的title元素:",result)


3. 选取未知节点

'''
03-XPath模块-选取未知节点
'''
from lxml import etree

htmlDom = etree.parse("book.xml")

# 1.选取bookstore元素的所有子元素
result = htmlDom.xpath("/bookstore/*")
print("1.选取bookstore元素的所有子元素:",result)

# 2.选取文档中的所有元素
result = htmlDom.xpath("//*")
print("2.选取文档中的所有元素:",result)

# 3.选取所有带有属性title的元素
result = htmlDom.xpath("//title[@*]")
print("3.选取文档中的所有title元素且带有属性的元素:",result)
print(result[0].text)
print(result[1].text)
print(result[2].text)
print(result[3].text)

4. 选取若干路径

'''
04-XPath模块-选取若干路径
'''
from lxml import etree

# 转换
htmlDom = etree.parse("book.xml")

# 1.选取book元素的所有title和price元素
result = htmlDom.xpath("//book/title|//book/price")
print("1.选取book元素的所有title和price元素:",result)

# 2.选取文档中所有title和price元素
result = htmlDom.xpath("//title|//price")
print("2.选取文档中所有title和price元素",result)

# 3.选取属于bookstore元素book元素的所有title元素以及文档中的所有price
result = htmlDom.xpath("/bookstore/book/title | //price")
print("3.选取属于bookstore元素book元素的所有title元素以及文档中的所有price:",result)

# "//h1|//div[@id='htmlContent']"
# result[0]  result[1]

5. 使用XPath定位Html简单实例

已知Html实例如下:

<div>
  <ul>
    <li class="item-0">
      <a href="link1.html">first item</a>
    </li>
    <li class="item-1">
      <a href="link2.html">second item</a>
    </li>
    <li class="zpp-item">
      <a href="link3.html">third item</a>
    </li>
    <li class="item-1">
      <a href="link4.html">fourth item</a>
    </li>
    <li class="item-0">
      <a href="link5.html">fifth item</a>
      <span>很棒棒哦!</span>
    </li>
  </ul>
</div>

使用XPath语法进行定位:

'''
XPath模块-实例测试
'''
from lxml import etree

html = etree.parse("hello.html")

# 1.获取所有的li标签
result = html.xpath("//li")
print("1.获取所有的li标签:",result[0].attrib)

# 2.获取所有的li标签下的class属性
result = html.xpath("//li/@class")
print("2.获取所有的li标签下的class属性:",result)

# 3.获取li标签下href的值为link1.html
result = html.xpath("//li/a[@href='link1.html']")
print("3.获取li标签下href的值为link1.html的元素",result[0].text)

# 4.获取所有的li标签下span标签
result = html.xpath("//li//span")
print("4.获取所有的li标签下span标签:",result)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值