Общее объяснение различий между XPath и CSS см. В документах Scrapy :
Scrapy поставляется с собственным механизмом извлечения данных.Их называют селекторами, потому что они «выбирают» определенные части документа HTML, заданные выражениями XPath или CSS.
XPath - это язык для выбора узлов в документах XML, который также может использоваться с HTML.CSS - это язык для применения стилей к документам HTML.Он определяет селекторы для связи этих стилей с конкретными элементами HTML.
XPath предлагает больше возможностей, чем чистый выбор CSS (статья Википедии дает хороший обзор), за счет того, чтотруднее учиться.Scrapy конвертирует CSS-селекторы в XPath для внутреннего использования, поэтому функция .css()
по сути является синтаксическим сахаром для .xpath()
, и вы можете использовать тот, который вам удобнее.
Что касается ваших конкретных примеров, я думаю, что проблема в том,что ваш запрос XPath на самом деле не относится к предыдущему селектору (кавычка div), а абсолютен ко всему документу.См. Цитату из «Работа с относительными XPaths» в документах Scrapy:
Имейте в виду, что если вы вкладываете селекторы и используете XPath, начинающийся с /, этот XPathбудет абсолютным по отношению к документу, а не по отношению к селектору, из которого вы его вызываете.
Чтобы получить тот же результат, что и с вашим селектором CSS, вы можете использовать что-то вроде этого, где запрос XPath имеет видотносительно кавычки div:
for quote in response.css('div.quote'):
print(quote.xpath('span[@class="text"]/text()').extract())
Обратите внимание, что XPath также имеет выражение .
для выполнения любого запроса относительно текущего узла, но я не уверен, как Scrapy реализуетэто (использование './/*[@class="text"]/text()'
также дает желаемый результат).