Как выбрать предыдущий элемент с помощью xpath?

#python #css #web-scraping #xpath #scrapy

Вопрос:

Мне нужно выбрать первое изображение, которое я увижу (вверх по DOM) после ссылки. У меня есть такой код, но он почему-то не работает, где может быть ошибка?

 for doc in response.css('a::attr("href")'):  if '/mans/' in doc.get():  image = doc.xpath(f'//a[href={doc.get()}]/preceding::img[1]')  print(image)  

может ли быть синтаксическая ошибка? вот пример проанализированной страницы…

 lt;tbodygt;  lt;trgt;  lt;tdgt;  lt;img src="Resources/Images/Product images, logos/Alta, Alta HR/Alta_Black_Calendar_Horizontal_Shadow.png" alt="Fitbit Alta with the time shown on the screen" /gt;  lt;/tdgt;  lt;tdgt;  lt;pgt;lt;a href="https://help.fitbit.com/manuals/manual_alta_de.pdf" target="_blank"gt;Deutschlt;/agt;  lt;/pgt;  lt;pgt;lt;a href="https://help.fitbit.com/manuals/manual_alta_en_US.pdf" target="_blank"gt;Englishlt;/agt;  lt;/pgt;  lt;pgt;lt;a href="https://help.fitbit.com/manuals/manual_alta_es.pdf" target="_blank"gt;Españollt;/agt;  lt;/pgt;  lt;/tdgt;  lt;tdgt;  lt;pgt;lt;a href="https://help.fitbit.com/manuals/manual_alta_fr.pdf" target="_blank"gt;Françaislt;/agt;  lt;/pgt;  lt;pgt;lt;a href="https://help.fitbit.com/manuals/manual_alta_it.pdf" target="_blank"gt;Italianolt;/agt;  lt;/pgt;  lt;pgt;lt;a href="https://help.fitbit.com/manuals/manual_alta_ja.pdf" target="_blank"gt;日本語lt;/agt;  lt;/pgt;  lt;/tdgt;  lt;tdgt;  lt;pgt;lt;a href="https://help.fitbit.com/manuals/manual_alta_ko.pdf" target="_blank"gt;한국어lt;/agt;  lt;/pgt;  lt;pgt;lt;a href="https://help.fitbit.com/manuals/manual_alta_zh_CN.pdf" target="_blank"gt;简体中文lt;/agt;  lt;/pgt;  lt;pgt;lt;a href="https://help.fitbit.com/manuals/manual_alta_zh_TW.pdf" target="_blank"gt;繁體中文lt;/agt;  lt;/pgt;  lt;/tdgt;  lt;/trgt;  lt;/tbodygt;  

Комментарии:

1. Можете ли вы поделиться воспроизводимым кодом, который мы можем вам предоставить?

2. @Geomario добавил html-выдержку к вопросу…

Ответ №1:

Поставьте @ перед href в вашем заявлении xpath, и это должно сработать, учитывая, что элемент перед ссылкой является изображением.

 f'//a[@href={doc.get()}]/preceding::img[1]'