Python: Usar 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é los 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. Localicé 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 la 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 relativo) o contra el árbol raíz (si es absoluto):”. Entonces, ¿lo que uso es una expresión absoluta y necesito hacerla relativa? ¿Es asi?

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

Su xpath comienza con una barra ( / ) y, por lo tanto, es absoluta. 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/')]") 

Otra opción sería pedir directamente los elementos dentro de su 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 la identificación de la tabla o la clase. Por ejemplo:

 links = tree.xpath("//table[@id='my_table_id']//a[contains(@href, 'http://www.example.com/filter/')]")