XPath не возвращает результатов для некоторых элементов с оболочкой scrapy - PullRequest
0 голосов
/ 14 апреля 2020

Я использую оболочку Scrapy для извлечения данных следующей веб-страницы:

https://www.apo-in.de/product/acc-akut-600-brausetabletten.24170.html

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

scrapy shell
fetch('https://www.apo-in.de/product/acc-akut-600-brausetabletten.24170.html')
>>> response.xpath('//*[@id="accordionContent5e95408f73b10"]/div/table/tbody/tr[1]/td/text()').extract()

Возвращает: []

enter image description here

Я также загрузил страницу для просмотра в том виде, в каком ее видит scrapy:

scrapy fetch --nolog https://www.apo-in.de/product/acc-akut-600-brausetabletten.24170.html > test.html

Хотя она выглядит нормально в HTML и хотя я могу получить ее в chrome, она не работает в оболочке scrapy ,

Как я могу получить эти данные?

1 Ответ

0 голосов
/ 14 апреля 2020

Проблема, с которой вы столкнулись, заключается в том, что id 'accordionContent5e95408f73b10' генерируется динамически. Итак, id в вашем браузере и ответ scrapy разные.

В обычных случаях есть хороший обходной путь для написания xpath с помощью «поиска по подстроке» (//*[contains(@id, 'accordionContent')]), но в этом случае таких идентификаторов много.

Я могу посоветовать написать более сложный XPath.

//div[@id='accordion']/div[contains(@class, 'panel')][1]/div[contains(@id, 'accordionContent')]/div[@class='panel-body']/table/tbody/tr[1]/td

Что делает этот xpath:

  1. Найти все «подпанели» с описаниями //div[@id='accordion']/div[contains(@class, 'panel')];

  2. Мы получить первую «подпанель» (где находится PZN) и перейти к таблице с данными: //div[@id='accordion']/div[contains(@class, 'panel')][1]/div[contains(@id, 'accordionContent')]/div[@class='panel-body']/table;

  3. И последняя часть извлекает td первого tr.

Кстати, xpath можно упростить до //div[@id='accordion']/div[contains(@class, 'panel')][1]//table/tbody/tr[1]/td. Но я написал полный xpath для более точного понимания того, что мы делаем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...