Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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