【问题标题】:How to translate a BeautifulSoup element to xpath?如何将 BeautifulSoup 元素转换为 xpath?
【发布时间】:2017-07-23 03:03:27
【问题描述】:

例如:

html = "
<ul>
     <li class="item-0"><a href="link1.html">first item</a></li>
     <li class="item-1"><a href="link2.html">second item</a></li>
     <li class="item-inactive"><a href="link3.html">third item</a></li>
     <li class="item-1"><a href="link4.html">fourth item</a></li>
     <li class="item-0"><a href="link5.html">fifth item</a>
</ul>"
soup = BeautifulSoup(html)
item_0 = soup.select_one('ul li.item-0')

有没有像soup_to_xpath(item_0) 这样的函数可以将item_0 翻译成'/html/body/ul/li[5]' 或类似的东西?

【问题讨论】:

    标签: python xpath beautifulsoup


    【解决方案1】:

    AFAIK 无法在 bs4 中使用 XPath

    提供的CSS 选择器可以“翻译”成XPath

    //ul/li[@class="item-0"]
    

    //li[.="fifth element"]
    

    您可以使用以下代码:

    from lxml import etree
    from lxml.cssselect import CSSSelector # You might need to run "pip install cssselect"
    
    sel = CSSSelector('ul li.item-0')
    sel.path
    

    输出:

    "descendant-or-self::ul/descendant-or-self::*/li[@class and contains(concat(' ', normalize-space(@class), ' '), ' item-0 ')]"
    

    【讨论】:

    • 我只是想获得 xpath。 “提供的 CSS 选择器可以“翻译”成 XPath”是什么意思?
    • 'ul li.item-0' 是一个CSS 选择器。您想使用BeautifulSoup 生成XPath 还是任何其他自动化工具来生成它?澄清您的问题
    • "您想使用 BeautifulSoup 生成 XPath 还是任何其他自动化工具来生成它?"这正是我想要的......
    • 您可以尝试使用lxml.etree (lxml.de/tutorial.html) 生成绝对的XPath 表达式,如此处所述stackoverflow.com/questions/24411765/…
    • tree.getpath(element)这里的元素好像是lxml对象,我想把一个bs元素翻译成xpah,和题主一样的需求。
    【解决方案2】:

    lxml 使用 cssselect 模块来执行这样的任务:

    In [1]: from cssselect import GenericTranslator, SelectorError
    
    In [2]: expression = GenericTranslator().css_to_xpath('ul li.item-0')
    
    In [3]: expression
    Out[3]: "descendant-or-self::ul/descendant-or-self::*/li[@class and contains(concat(' ', normalize-space(@class), ' '), ' item-0 ')]"
    

    【讨论】:

      猜你喜欢
      • 2010-12-21
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 2015-03-11
      • 1970-01-01
      • 2016-11-08
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多