2009-12-20 5 views
4

Je construis des expressions xpath relativement complexes en Python, afin de les transmettre au sélénium. Cependant, c'est assez facile de faire une erreur, donc je suis à la recherche d'une bibliothèque qui me permet de construire les expressions sans se tromper avec des chaînes. Par exemple, au lieu d'écrireGénérateur Xpath en Python

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

Je pourrais écrire quelque chose comme:

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

qui est peut-être pas aussi lisible, mais est moins sujette aux erreurs. Est-ce que quelque chose comme ça existe?

Répondre

0

Vous pouvez utiliser lxml.etree qui permet d'écrire du code comme suit:

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

L'API lxml est merveilleux. Aussi très rapide, car il s'agit principalement de simples liaisons à la librairie C libxml2. – Confusion

+3

J'essaye de construire des instructions xpath. Cela semble construire des instructions XML. –

1

bien que ce n'est pas exactement ce que vous voulez .. vous pouvez utiliser le sélecteur CSS

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

généré l'expression XPath est dans selobj.path

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