Python 3.x 如何获取与给定正则表达式匹配的所有XPath?

Python 3.x 如何获取与给定正则表达式匹配的所有XPath?,python-3.x,xpath,web-scraping,beautifulsoup,scrapy,Python 3.x,Xpath,Web Scraping,Beautifulsoup,Scrapy,是否有任何python库可以方便地获取与给定正则表达式匹配的dom节点的XPath 我正在尝试从faq页面获取问答对 这是三个不同的问题 现在让正则表达式如下所示: /html/body/div[1]/div[2]/div[3]/div[2]/div/div[2]/div/ * / * / * /div[1]/a/span 是否有可能获得所有满足我们通过python中的某个库构建的正则表达式的XPath 我尝试使用scrapy选择器获取所有问题,但在获取答案时失败,因此我希望遍历所有问题,然后

是否有任何python库可以方便地获取与给定正则表达式匹配的dom节点的XPath

我正在尝试从faq页面获取问答对

这是三个不同的问题

现在让正则表达式如下所示:

/html/body/div[1]/div[2]/div[3]/div[2]/div/div[2]/div/ * / * / * /div[1]/a/span
是否有可能获得所有满足我们通过python中的某个库构建的正则表达式的XPath


我尝试使用scrapy选择器获取所有问题,但在获取答案时失败,因此我希望遍历所有问题,然后获取他们的答案,为此,我希望使用问题XPath,您不需要工具或正则表达式(以及绝对XPath表达式)。尝试使用以下XPath匹配页面上的所有问题:

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

如果您不知道如何编写自己的选择器,请选中此复选框,因为您不需要工具或正则表达式(以及绝对XPath表达式)。尝试使用以下XPath匹配页面上的所有问题:

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

如果您不知道如何编写自己的选择器,请检查此项。

最后,我通过lxml和scrapy的组合找到了解决方案。 使用@Andersson answer使用选择器查找所有文本内容,然后针对每个文本,在树上迭代并使用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)

最后,我找到了解决这个问题的方法,将lxml和scrapy结合起来。 使用@Andersson answer使用选择器查找所有文本内容,然后针对每个文本,在树上迭代并使用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)

我们可以通过它来获取问题,但在获取答案时,我无法继续使用类名方法,这并没有按顺序给我们输出,这就是为什么我需要XPath。如果我在一个页面中根本没有类名怎么办?你可以使用元素/父/后代/子/祖先的其他属性。。。答案的XPath是
//div[@class=“ClsInnerDropCont”]
我同意我尝试过使用类名。但问题是scrapy是异步的,所以我无法按顺序获得输出。所以我需要导航到每个问题的答案。所以,如果我有问题的XPath,那么我可以通过使用属性轻松找到答案。您可以找到公共父级
//div[@class=“ClsDropDownArea”]
,然后找到合适的问题和答案,如
/div[@class=“ClsInnerDrop”]/a
/div[@class=“ClsInnerDropCont”]
…我得到的响应是空的。xpath('./div[@class=“ClsInnerDropCont”]//text()).extract()我们可以通过它来获取问题,但在获取答案时,我无法继续使用类名方法,这并没有按顺序给我们输出,这就是为什么我需要XPath。如果我在一个页面中根本没有类名怎么办?你可以使用元素/父/后代/子/祖先的其他属性。。。答案的XPath是
//div[@class=“ClsInnerDropCont”]
我同意我尝试过使用类名。但问题是scrapy是异步的,所以我无法按顺序获得输出。所以我需要导航到每个问题的答案。所以,如果我有问题的XPath,那么我可以通过使用属性轻松找到答案。您可以找到公共父级
//div[@class=“ClsDropDownArea”]
,然后找到合适的问题和答案,如
/div[@class=“ClsInnerDrop”]/a
/div[@class=“ClsInnerDropCont”]
…我得到的响应是空的。xpath('./div[@class=“ClsInnerDropCont”]//text()).extract()