Python中的Xpath构建器
我正在用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']"