Python中的Xpath构建器

4 投票
2 回答
1302 浏览
提问于 2025-04-15 17:12

我正在用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"))

虽然这样可能不太容易读懂,但出错的可能性小一些。有没有类似的东西呢?

2 个回答

0

你可以使用 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 …")
  )
)
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']"

撰写回答