2009-12-20 53 views
4

我在Python中構建相對複雜的xpath表達式,以便將它們傳遞給硒。但是,它很容易犯一個錯誤,所以我正在尋找一個庫,它允許我構建表達式而不會弄亂字符串。例如,而不是寫Python中的Xpath構建器

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")) 

,但這可能不是爲可讀,但不易出錯。有這樣的事嗎?

回答

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 …") 
) 
) 
+0

lxml API非常好。也非常快,因爲它主要是綁定到libxml2 C庫。 – Confusion 2009-12-20 12:37:43

+3

我正在嘗試構建xpath語句。這似乎構建XML語句。 – 2009-12-20 13:11:24

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']"