Python: использование xpath локально / для определенного элемента

Я пытаюсь получить ссылки со страницы с xpath. Проблема в том, что я хочу только ссылки внутри таблицы, но если я применил выражение xpath на всей странице, я захвачу ссылки, которые я не хочу.

Например:

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

Проблема заключается в том, что применяется выражение для всего документа. Я нашел элемент, который я хочу, например:

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

Но это похоже на выполнение запроса во всем документе, так как я все еще захватываю ссылки за пределами таблицы. На этой странице говорится, что «Когда xpath () используется в элементе, выражение XPath оценивается против элемента (если оно относительное) или против корневого дерева (если оно абсолютное):». Итак, что я использую, является абсолютным выражением, и мне нужно сделать его относительным? Это оно?

В принципе, как я могу фильтровать только те элементы, которые существуют внутри этой таблицы?

Ваш xpath начинается с косой черты ( / ) и поэтому является абсолютным. Добавьте точку ( . ) Спереди, чтобы сделать ее относительно текущего элемента, т.е.

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

Другой вариант – запросить непосредственно элементы внутри вашей таблицы. Например:

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

Где **criteria** необходимы, если на странице много таблиц. Некоторыми возможными критериями могут быть фильтрация на основе идентификатора таблицы или класса. Например:

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