Python XPath语法详解:从入门到精通的全面指南

Python XPath语法完全指南:从基础到高级应用

XPath(XML Path Language)是一种用于在XML和HTML文档中查找信息的语言,广泛应用于网页抓取、数据提取和自动化测试等领域。本文将全面介绍XPath的核心语法和高级用法,帮助您掌握这一强大的数据定位工具。

一、XPath基础语法

1.1 节点选择

XPath提供了多种节点选择方式:

  • /:从根节点开始的绝对路径(如/html/body/div)
  • //:全局搜索节点,不考虑位置(如//div匹配所有<div>)
  • .:选择当前节点
  • ..:选择当前节点的父节点
  • 1.2 通配符

  • *:匹配任意元素节点(如//book/*选择<book>的所有子元素)
  • @*:匹配任何属性节点(如//div[@*]选择所有带属性的<div>)
  • node():匹配任何类型的节点
  • 二、属性与条件过滤

    2.1 属性选择

  • @:选择属性(如//input[@id="search"]匹配id="search"<input>)
  • contains(@attr, "value"):模糊匹配属性值(如//a[contains(@class, "btn")])
  • starts-with(@attr, "value"):匹配属性前缀(如//a[starts-with(@href, "https://")])
  • 2.2 谓语(条件过滤)

    谓语用于进一步过滤节点,写在方括号[]中:

  • 按位置://ul/li[1](选择第一个<li>)
  • 按数值://book[price>35](选择价格大于35的<book>)
  • 逻辑运算:and/or(如//div[@class="header" or @id="top"])
  • 三、文本与函数操作

    3.1 文本内容匹配

  • text():选择节点文本(如//h1[text()="标题"]精确匹配文本)
  • contains(text(), "关键词"):模糊匹配文本(如//p[contains(text(), "爬虫")])
  • 3.2 常用函数

  • last():选择最后一个节点(如//li[last()])
  • position():按位置范围选择(如//div[position()<3]选前两个<div>)
  • count():计算节点数量(如//div[count(p)>3]选择包含超过3个<p><div>)
  • 四、轴(Axis)定位

    轴可以定义相对于当前节点的节点集:

    4.1 家族关系轴

  • child:::子节点(默认轴,可省略,如/html/child::body)
  • parent:::父节点(如//a/parent::div)
  • following-sibling:::后续兄弟节点(如//li[1]/following-sibling::li)
  • 4.2 范围轴

  • ancestor:::祖先节点(如//span/ancestor::div)
  • descendant:::后代节点(如//div/descendant::p)
  • preceding-sibling:::前驱兄弟节点(如//li[3]/preceding-sibling::li选择前两个<li>)
  • 五、高级用法

    5.1 动态属性处理

  • 使用contains()匹配部分属性值(如//div[contains(@class, "nav_")]匹配动态变化的Class名)
  • 部分解析器(如lxml)支持matches()函数(需XPath 2.0+):
    //div[matches(@id, '\d+$')]  # 匹配数字结尾的ID属性
    
  • 5.2 复杂条件组合

    //input[@type="text" and @name="user"][position()=1]  # 首个满足条件的输入框
    

    5.3 字符串处理函数

  • substring():截取文本(如//span[substring(text(), 1, 4)="2025"]匹配以2025开头的文本)
  • concat():拼接属性(如//a[concat(@href, @title)="/about关于我们"])
  • 六、实战技巧

    1. 避免绝对路径依赖

      //*[@id="main"]//p  # 优于 /html/body/div[1]/div[2]/p
      
    2. 表格数据提取

      //table//tr[td[2]="价格"]/td[1]  # 定位第二列为"价格"的行,返回第一列数据
      
    3. 多路径查询

      //title | //price  # 选择所有<title>和<price>元素
      

    七、Python实战示例

    from lxml import etree
    
    html = etree.HTML(html_text)
    # 提取所有带href属性的<a>标签
    links = html.xpath('//a[@href]')
    # 获取第二个<div>的文本内容
    text = html.xpath('//div[2]/text()')
    # 使用contains函数匹配部分class
    nav_items = html.xpath('//div[contains(@class, "nav_")]')
    

    总结

    XPath通过路径表达式、属性过滤、函数和轴定位,实现精准的节点选择。掌握核心语法(如//@[])和常用函数(如contains()last())是高效解析HTML/XML的关键。在实际应用中,灵活组合这些功能可以应对各种复杂的数据提取场景。

    作者:红皮西瓜绿了心

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python XPath语法详解:从入门到精通的全面指南

    发表回复