• 【实用 Python 库】使用 XPath 与 lxml 模块在 Python 中高效解析 XML 与 HTML


    在今天的信息时代,数据无处不在,从网络爬虫到数据挖掘,从文本处理到数据分析,我们时常需要从结构化文档中提取有用的信息。XPath 是一门强大的查询语言,它可以在 XML 与 HTML 等文档中定位特定的元素与数据。而在 Python 中,lxml 模块为我们提供了一种高效解析 XML 与 HTML 的工具,让我们能够轻松地利用 XPath 进行数据提取与处理。

    什么是 XPath?

    XPath(XML Path Language)是一门用于在 XML 文档中导航和选择元素的查询语言。它使用路径表达式来定位文档中的节点,类似于文件系统路径。XPath 不仅仅是用于 XML,还可以应用于 HTML 文档等结构化数据。XPath 的语法灵活而强大,能够根据元素的层次结构、属性、文本内容等条件来精确定位目标节点。

    lxml 模块简介

    lxml 是一个功能强大且高效的 Python 库,用于处理 XML 与 HTML 文档。它是基于 C 语言的 libxml2libxslt 库构建的,因此具有出色的性能。通过 lxml,我们可以将文档解析为一个树状结构,并使用 XPath 表达式从中提取所需的信息。

    安装 lxml

    在开始之前,我们需要确保已经安装了 lxml。如果还未安装,可以使用以下命令进行安装:

    pip install lxml
    
    • 1

    基本的 XPath 查询

    让我们从一个简单的 XML 文档开始,看看如何使用 XPath 来选择节点。考虑以下 XML 文档:

    <bookstore>
      <book>
        <title>Python Programmingtitle>
        <author>John Doeauthor>
      book>
      <book>
        <title>Web Development Basicstitle>
        <author>Jane Smithauthor>
      book>
    bookstore>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    我们想要选择所有书籍的标题,可以使用以下 XPath 表达式:

    //title
    
    • 1

    lxml 中,我们可以这样来实现:

    from lxml import etree
    
    # 解析 XML
    xml = """
    
      
        Python Programming
        John Doe
      
      
        Web Development Basics
        Jane Smith
      
    
    """
    
    root = etree.fromstring(xml)
    
    # 使用 XPath 查询
    titles = root.xpath('//title')
    
    for title in titles:
        print(title.text)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    运行上述代码,你将会得到两本书的标题:

    Python Programming
    Web Development Basics
    
    • 1
    • 2

    使用 XPath 选择属性与文本内容

    XPath 不仅可以用于选择元素本身,还可以选择元素的属性和文本内容。考虑以下 XML 文档:

    <student>
      <name first="John" last="Doe" />
      <age>25age>
    student>
    
    • 1
    • 2
    • 3
    • 4

    如果我们想要选择姓名的姓氏和年龄,可以这样做:

    //name/@last
    //age/text()
    
    • 1
    • 2

    在代码中的应用如下:

    xml = """
    
      
      25
    
    """
    
    root = etree.fromstring(xml)
    
    last_name = root.xpath('//name/@last')[0]
    age = root.xpath('//age/text()')[0]
    
    print(f"Last Name: {last_name}")
    print(f"Age: {age}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行代码,你将会看到输出:

    Last Name: Doe
    Age: 25
    
    • 1
    • 2

    使用 XPath 的谓语(Predicates)

    XPath 还支持谓语,它允许我们在选择节点时添加条件过滤。考虑以下 XML 文档:

    <students>
      <student>
        <name>John Doename>
        <age>25age>
      student>
      <student>
        <name>Jane Smithname>
        <age>22age>
      student>
    students>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如果我们只想选择年龄大于 23 岁的学生,可以这样使用谓语:

    //student[age > 23]
    
    • 1

    在代码中,我们可以这样做:

    xml = """
    
      
        John Doe
        25
      
      
        Jane Smith
        22
      
    
    """
    
    root = etree.fromstring(xml)
    
    selected_students = root.xpath('//student[age > 23]')
    
    for student in selected_students:
        name = student.xpath('name/text()')[0]
        age = student.xpath('age/text()')[0]
        print(f"Name: {name}, Age: {age}")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    运行代码,你将会得到年龄大于 23 岁的学生信息:

    Name: John Doe, Age: 25
    
    • 1

    结语

    XPath 是一个强大的工具,结合 lxml 模块,我们可以轻松地在 Python 中实现高效的 XML 与 HTML 解析与数据提取。本文介绍了基本的 XPath 查询语法以及如何使用 lxml 模块进行解析与操作。XPath 的语法丰富多样,允许我们根据需要精确地定位和提取所需的信息,为数据处理带来了极大的便利。无论是从网页中提取数据、分析 XML 配置文件,还是进行数据挖掘,XPath 与 lxml 都将是你的得力工具。

  • 相关阅读:
    springboot 如何获取URL请求参数呢?
    爬虫 — 多线程
    【Docker】- 【入门】- 001 - 创建docker 账户 以及 上传image和部署image
    企业文件防泄密软件!好用的文件加密系统推荐
    入门简单,轻量好用的低代码开发平台推荐
    全面的ASP.NET Core Blazor简介和快速入门
    【精讲】async,await简介及与Ajax合用案例(内含面试内容)
    思维模型丨看先辈是如何学习的?
    mac上使用Vmware Fusion虚拟机配置Centos的静态ip
    大数据必学Java基础(九十):通过反射获取运行时类的完整结构
  • 原文地址:https://blog.csdn.net/qq_21484461/article/details/132596099