Пустой список как результат объекта ответа scrapy - PullRequest
0 голосов
/ 04 августа 2020

Я очищаю эту веб-страницу и, пытаясь извлечь текст из одного элемента, захожу в тупик.

Итак, рассматриваемый элемент показан ниже на изображении - введите описание изображения здесь

Текст в этом элементе находится внутри тегов <p> внутри <div>. Я попытался извлечь текст в оболочке scrapy, используя следующий код - response.css("div.home-hero-blurb no-select::text").getall(). В результате я получил пустой список.

В качестве альтернативы, если я попытаюсь пойти немного дальше и ссылаться на теги <p> по отдельности, я могу получить текст. Почему так происходит? Разве <div> не является родительским элементом, и мой код не должен извлекать текст?

Примечание. Я хотел использовать div, потому что думал, что это поможет мне получить и <p> теги в одном запросе.

1 Ответ

1 голос
/ 04 августа 2020

Я вижу здесь две проблемы.

Во-первых, если вы разделите имя класса пробелами, селектор css поймет, что вы ищете дочерний элемент с таким именем. Таким образом, правильный подход - "div.home-hero-blurb.no-select::text" вместо "div.home-hero-blurb no-select::text".

Вторая проблема заключается в том, что текст, который вы хотите, находится внутри элемента p, который является потомком этого div. Если вы выберете только div, селектор вернет текст внутри div, но не в его дочерних элементах. Поскольку есть также элемент strong как дочерний элемент p, я бы предложил использовать универсальный подход, например:

response.css("div.home-hero-blurb.no-select *::text").getall()

Это должно вернуть весь текст из div и его потомков.

Следует отметить, что извлечение текста из селекторов css является расширением стандартных селекторов. Scrapy упоминает это здесь .

Edit

Если бы вы использовали XPath, это было бы эквивалентное выражение:

response.xpath('//div[@class="home-hero-blurb no-select"]//text()').getall()
...