【问题标题】:Xpath builder in Python [closed]Python中的Xpath构建器[关闭]
【发布时间】:2010-12-28 10:18:00
【问题描述】:

我正在 Python 中构建相对复杂的 xpath 表达式,以便将它们传递给 selenium。然而,它很容易出错,所以我正在寻找一个库,它允许我构建表达式而不会弄乱字符串。例如,而不是写

locator='//ul[@class="comment-contents"][contains(., "West")]/li[contains(., "reply")]

我可以这样写:

import xpathbuilder as xpb
locator = xpb.root("ul")
             .filter(attr="class",value="comment-contents")
             .filter(xpb.contains(".", "West")
             .subclause("li")
             .filter(xpb.contains (".", "reply"))

这可能不那么可读,但不易出错。有这样的东西吗?

【问题讨论】:

    标签: python xml xpath selenium


    【解决方案1】:

    虽然这不是你想要的......你可以使用 css 选择器

    ...
    import lxml.cssselect
    csssel = 'div[class="main"]'
    selobj = lxml.cssselect.CSSSelector(csssel)
    elements = selobj(documenttree)
    

    生成的 XPath 表达式位于 selobj.path

    >>> selobj.path
    u"descendant-or-self::div[@class = 'main']"
    

    【讨论】:

      【解决方案2】:

      您可以使用lxml.etree 允许编写如下代码:

      from lxml.builder import ElementMaker # lxml only !
      
      E = ElementMaker(namespace="http://my.de/fault/namespace", nsmap={'p' : "http://my.de/fault/namespace"})
      
      DOC = E.doc
      TITLE = E.title
      SECTION = E.section
      PAR = E.par
      
      my_doc = DOC(
        TITLE("The dog and the hog"),
        SECTION(
          TITLE("The dog"),
          PAR("Once upon a time, ..."),
          PAR("And then …")
        ),
        SECTION(
          TITLE("The hog"),
          PAR("Sooner or later …")
        )
      )
      

      【讨论】:

      • lxml API 非常棒。也非常快,因为它主要是对 libxml2 C 库的简单绑定。
      • 我正在尝试构建 xpath 语句。这似乎构建了 XML 语句。
      猜你喜欢
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      • 2011-03-23
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      相关资源
      最近更新 更多