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

Я пытаюсь получить ссылки со страницы с 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 оценивается по элементу (если относительный) или по отношению к корневому дереву (если абсолютный):"Итак, что я использую, это абсолютное выражение, и мне нужно сделать его относительным?Это так?

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

Ответы [ 2 ]

58 голосов
/ 24 января 2011

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

links = table.xpath(".//a[contains(@href, 'http://www.example.com/filter/')]")
0 голосов
/ 17 августа 2017

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

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