2010-04-14 25 views
11

Quiero analizar HTML con lxml usando expresiones XPath. Mi problema es coincidente de los contenidos de una etiqueta:¿Cómo puedo unir el contenido de un elemento en XPath (lxml)?

Por ejemplo da el elemento

<a href="http://something">Example</a> 

puedo coincidir con el atributo href usando

.//a[@href='http://something'] 

pero la da la expresión

.//a[.='Example'] 

o incluso

.//a[contains(.,'Example')] 

lxml arroja la excepción 'predicado de nodo no válido'.

¿Qué estoy haciendo mal?

EDIT:

código Ejemplo:

from lxml import etree 
from cStringIO import StringIO 

html = '<a href="http://something">Example</a>' 
parser = etree.HTMLParser() 
tree = etree.parse(StringIO(html), parser) 

print tree.find(".//a[text()='Example']").tag 

salida esperada es 'a'. Recibo el mensaje 'SyntaxError: predicado nodo no válido'

+2

En lugar de utilizar StringIO, podría haber usado etree.fromstring() para analizar su html. –

Respuesta

18

me gustaría probar con:

.//a[text()='Example']

usando XPath) método (:

tree.xpath(".//a[text()='Example']")[0].tag 

Si caso de que quiera utilizar iterfind() , findall(), find(), findtext(), tenga en cuenta que las características avanzadas como comparación de valores y funciones no están disponibles en ElementPath.

lxml.etree supports the simple path syntax of the find, findall and findtext methods on ElementTree and Element, as known from the original ElementTree library (ElementPath). As an lxml specific extension, these classes also provide an xpath() method that supports expressions in the complete XPath syntax, as well as custom extension functions.

+0

No deseo encontrar el enlace basado en href, pero basado en el texto que contiene: "Ejemplo" en el ejemplo anterior :) .//a[@href='http://something '] funciona la forma en que es ... – akosch

+1

necesita eliminar un = .//a[text()='Example '] – Greg

+0

Gracias por su sugerencia, pero este plantea "SyntaxError: predicado de nodo no válido" también – akosch

Cuestiones relacionadas