в чем разница response.xpath и response.css - PullRequest
0 голосов
/ 02 июня 2018

Я пытался узнать response.xpath и response.css, используя сайт: http://quotes.toscrape.com/

scrapy shell 'http://quotes.toscrape.com'
for quote in response.css("div.quote"):
    title = quote.css("span.text::text").extract()

, это будет иметь только одно значение.но если я использую xpath:

scrapy shell 'http://quotes.toscrape.com'
    for quote in response.css("div.quote"):
    title = quote.xpath('//*[@class="text"]/text()').extract()

, он получит список всех заголовков на всей странице.

Могут ли некоторые люди сказать мне, что отличается с помощью двух инструментов?какой-то элемент, который я предпочитаю использовать response.xpath, например, конкретное содержимое таблицы, легко получить с помощью follow-sibling, но response.css не может получить

1 Ответ

0 голосов
/ 04 июня 2018

Общее объяснение различий между 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()' также дает желаемый результат).

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