【问题标题】:How to get all xpaths that are matching given regex?如何获取与给定正则表达式匹配的所有 xpath?
【发布时间】:2018-09-12 09:55:45
【问题描述】:

是否有任何 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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我们可以通过它获取问题,但是在获取答案时我无法继续使用类名方法,并且这不会按顺序给我们输出,这就是我需要 xpaths 的原因。如果我在页面中根本没有类名怎么办?
    • 您可以使用 element/parent/descendant/child/ancestor 的其他属性...答案的 XPath 是 //div[@class="ClsInnerDropCont"]
    • 我同意我尝试使用类名。但问题是scrapy是异步的,所以我不会按顺序得到输出。所以我需要导航来回答每个问题。因此,如果我有问题的 XPath,那么我可以通过使用属性轻松找到答案。
    • 我认为这里没有问题。你可以找到共同的父母//div[@class="ClsDropDownArea"],然后找到适当的问题和答案./div[@class="ClsInnerDrop"]/a./div[@class="ClsInnerDropCont"]...
    • 我得到了这个 response.xpath(' ./div[@class="ClsInnerDropCont"]//text()' ).extract() 的空响应
    【解决方案2】:

    最后,我找到了解决方案,结合了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)
    

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 2010-10-13
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 2011-08-29
      相关资源
      最近更新 更多