如何获取与给定正则表达式匹配的所有xpath?

时间:2018-09-12 09:55:45

标签: python-3.x xpath web-scraping beautifulsoup scrapy

是否有任何Python库可帮助获取与给定正则表达式匹配的dom节点的xpath?

我正在尝试从常见问题页面中获取问答对

这是来自site

的三个不同的问题xpath
xpath1: /html/body/div[1]/div[2]/div[3]/div[2]/div/div[2]/div/div[1]/div/div[7]/div[1]/a/span
xpath2: /html/body/div[1]/div[2]/div[3]/div[2]/div/div[2]/div/div[1]/div/div[10]/div[1]/a/span
xpath3: /html/body/div[1]/div[2]/div[3]/div[2]/div/div[2]/div/div[3]/div[1]/div[1]/div[1]/a/span

现在让正则表达式变成这样:

/html/body/div[1]/div[2]/div[3]/div[2]/div/div[2]/div/ * / * / * /div[1]/a/span

是否有可能通过python中的某个库获取所有满足我们构建的正则表达式的xpath?

我尝试使用scrapy选择器来获取所有问题,但是在获取答案时却失败了,所以我想遍历所有问题然后获取他们的答案,为此,我想要问题Xpaths

2 个答案:

答案 0 :(得分:2)

您不需要工具或正则表达式(以及绝对XPath表达式)。尝试使用以下XPath来匹配页面上的所有问题:

//div[@class="ClsInnerDrop"]/a

如果您不知道如何编写自己的选择器,请选中此cheatsheet

答案 1 :(得分:0)

最后,我找到了结合lxml和scrapy的解决方案。 使用@Andersson答案使用选择器查找所有文本内容,然后针对每个文本遍历树,并使用lxml中的 tree.getpath()

该解决方案不是基于正则表达式的,而是解决了我的用例,因此将其发布

import requests
from lxml import html

def get_xpath_for_text(tree, text):
 try:
    for tag in tree.iter():
        if tag.text and tag.text == text:
            return tree.getpath(tag)
    return ' '
 except Exception as e:
    return ' '

 webpage = requests.get(url)
 html_content = html.fromstring(webpage.text)
 tree= html_content.getroottree()
 get_xpath_for_text(tree, text)