lxml.xpath 中的正则表达式

Regex in lxml.xpath

我正在尝试创建一个函数,该函数 returns 从具有 xpath 的网站“我们的团队”页面命名。大多数情况下,这可以通过使用 classes 构建 xpath 来完成,然后可以一次性获取它们。然而,在某些情况下,即使使用 classes,它们也不相同。例如,这是同一页面上 2 个人的 xpath:

//html/body/div[包含(@class,"el13")]/div[包含(@class,"el22")]/div[包含(@class, "el23") ]/文本() //html/body/div[包含(@class,"el3")]/div[包含(@class,"el 34")]/div[包含(@class, "el77")]/text()

有没有一种方法可以使用 tree.xpath 并为其提供 1 个包含正则表达式的 xpath? \d+ 表示一位或多位数字。有没有办法让 tree.xpath 像往常一样把所有的名字都抓到一个像这样的列表中?

//html/body/div[包含(@class,"el\d+")]/div[包含(@class,"= 40=]+")]/div[包含(@class, "el\d+")]/text()

我在文档中读到 lxml 库支持 EXSLT regex 库,但是我不熟悉如何以上述方式实现它。我在其他部分也经常使用常规正则表达式库,因此导入它可能会把事情搞砸(至少我是这样理解的)。此处有更多信息:https://lxml.de/xpathxslt.html

这是我目前执行此操作的代码部分:

content = requests.get("url of the page")
if content.status_code == 200:
    tree = html.fromstring(content)
    names = tree.xpath("the xpath to the names")

    # names returns something like ["John Smith", "Jane Smith", "Harry Cobbler"]
from lxml import etree as et

tree = et.fromstring(xml)

# define exslt namespace
reNS = "http://exslt.org/regular-expressions"
# prepare xpath with regexp
find = et.XPath("//div[re:test(@class, '^el\d+$', 'i')]", namespaces={'re':reNS})
# evaluate xpath
names = find.evaluate(tree)

这里是 XPath 谓词 [re:test(@class, '^el\d+$', 'i')],它使用 EXSLT test function。第一个参数是 class 属性,第二个参数 - 正则表达式,第三个参数 i 不区分大小写的标志。

您的 XPath 将如下所示:

//html/body/div[re:test(@class,"el\d+", "i")]/div[re:test(@class,"el\d+", "i")]/div[re:test(@class,"el\d+", "i")]/text()