Python XPath 运算符中的谓词表达式详解

2023-04-17 00:00:00 表达式 谓词 详解

XPath 谓词表达式用于筛选节点,在一个 XPath 表达式中可以包含多个谓词表达式,它们通过方括号括起来,如下所示:

//div[@class='main']//p[@id='content'][@style='font-size:16px']

上述 XPath 表达式中包含了两个谓词表达式,分别筛选了 class='main' 的 div 元素和 id='content' 且 style='font-size:16px' 的 p 元素。

以下是 Python XPath 中常用的谓词运算符:

  1. 等于运算符 (=)

等于运算符用于比较两个节点或节点属性的值是否相等,语法格式如下:

[属性名=属性值]

例如:[@class='main'] 表示选取 class 属性值为 'main' 的节点。

代码演示:

from lxml import etree

html = """
<div class="main">
    <p id="pidancode" style="font-size:16px">Hello world!</p>
    <p id="pidancode">Python XPath 谓词表达式详解</p>
</div>
"""

selector = etree.HTML(html)

print(selector.xpath('//div[@class="main"]//p[@id="pidancode"]')[0].text)

输出结果:

Hello world!
  1. 不等于运算符 (!=)

与等于运算符相反,不等于运算符用于比较两个节点或节点属性的值是否不相等,语法格式如下:

[属性名!=属性值]

例如:[@id!='pidancode'] 表示选取 id 属性值不为 'pidancode' 的节点。

代码演示:

from lxml import etree

html = """
<div class="main">
    <p id="pidancode" style="font-size:16px">Hello world!</p>
    <p id="pdd" style="font-size:18px">皮蛋编程</p>
</div>
"""

selector = etree.HTML(html)

print(selector.xpath('//div[@class="main"]//p[@id!="pidancode"]')[0].text)

输出结果:

皮蛋编程
  1. 包含运算符 (contains)

包含运算符用于判断一个节点或节点属性的值是否包含某个字符串,语法格式如下:

[contains(属性名, "字符串")]

例如:[contains(@id, 'pidancode')] 表示选取 id 属性值中包含 'pidancode' 的节点。

代码演示:

from lxml import etree

html = """
<div class="main">
    <p id="pidancode" style="font-size:16px">Hello world!</p>
    <p id="pdd" style="font-size:18px">皮蛋编程</p>
</div>
"""

selector = etree.HTML(html)

print(selector.xpath('//div[@class="main"]//p[contains(@id, "pidancode")]')[0].text)

输出结果:

Hello world!
  1. 逻辑运算符 (and, or)

逻辑运算符可以用于连接多个谓词表达式,常用的有 and 和 or 两种,语法格式如下:

[谓词1 and 谓词2]

[谓词1 or 谓词2]

例如:[@id="pidancode" and @style="font-size:16px"] 表示选取 id 属性值为 'pidancode' 且 style 属性值为 'font-size:16px' 的节点。

代码演示:

from lxml import etree

html = """
<div class="main">
    <p id="pidancode" style="font-size:16px">Hello world!</p>
    <p id="pdd" style="font-size:18px">皮蛋编程</p>
</div>
"""

selector = etree.HTML(html)

print(selector.xpath('//div[@class="main"]//p[@id="pidancode" and @style="font-size:16px"]')[0].text)

输出结果:

Hello world!

相关文章