Python: Usando xpath localmente / en un elemento específico


Estoy tratando de obtener los enlaces de una página con xpath. El problema es que solo quiero los enlaces dentro de una tabla, pero si aplico la expresión xpath en toda la página capturaré enlaces que no quiero.

Por ejemplo:

tree = lxml.html.parse(some_response)
links = tree.xpath("//a[contains(@href, 'http://www.example.com/filter/')]")

El problema es que aplica la expresión a todo el documento. He localizado el elemento que quiero, por ejemplo:

tree = lxml.html.parse(some_response)
root = tree.getroot()
table = root[1][5] #for example
links = table.xpath("//a[contains(@href, 'http://www.example.com/filter/')]")

Pero eso parece estar realizando la consulta en todo el documento también, ya que todavía estoy capturando los enlaces fuera de tabla. Esta página dice que "Cuando se usa xpath() en un elemento, la expresión XPath se evalúa contra el elemento (si es relativa) o contra el árbol raíz (si es absoluta):". Entonces, ¿qué uso es una expresión absoluta y necesito hacerla relativa? ¿Es eso?

Básicamente, ¿cómo puedo filtrar solo los elementos que existen dentro de esta tabla?

Author: pvt pns, 2011-01-24

2 answers

Su xpath comienza con una barra (/) y por lo tanto es absoluto. Agregue un punto (.) al frente para que sea relativo al elemento actual, es decir,

links = table.xpath(".//a[contains(@href, 'http://www.example.com/filter/')]")
 52
Author: phihag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-02-06 00:24:43

Otra opción sería preguntar directamente por los elementos dentro de la tabla. Por ejemplo:

tree = lxml.html.parse(some_response)
links = tree.xpath("//table[**criteria**]//a[contains(@href, 'http://www.example.com/filter/')]")

Donde **criteria** es necesario si hay muchas tablas en la página. Algunos criterios posibles serían filtrar según el id de la tabla o la clase. Por ejemplo:

links = tree.xpath("//table[@id='my_table_id']//a[contains(@href, 'http://www.example.com/filter/')]")
 0
Author: Pablo Guerrero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-17 18:39:53