Для извлечения данных из веб-страниц Scrapy использует метод, называемый селекторами, основанный на выражениях XPath и CSS . Ниже приведены некоторые примеры выражений XPath:
-
/ html / head / title — это выберет элемент <title> внутри элемента <head> документа HTML.
-
/ html / head / title / text () — это выделит текст в том же элементе <title>.
-
// td — это выберет все элементы из <td>.
-
// div [@class = «slice»] — это выберет все элементы из div, которые содержат атрибут class = «slice»
/ html / head / title — это выберет элемент <title> внутри элемента <head> документа HTML.
/ html / head / title / text () — это выделит текст в том же элементе <title>.
// td — это выберет все элементы из <td>.
// div [@class = «slice»] — это выберет все элементы из div, которые содержат атрибут class = «slice»
Селекторы имеют четыре основных метода, как показано в следующей таблице:
Sr.No | Метод и описание |
---|---|
1 |
экстракт () Возвращает строку в юникоде вместе с выбранными данными. |
2 |
Re () Возвращает список строк Unicode, извлеченный, когда регулярное выражение было задано в качестве аргумента. |
3 |
XPath () Он возвращает список селекторов, который представляет узлы, выбранные выражением xpath, заданным в качестве аргумента. |
4 |
CSS () Он возвращает список селекторов, который представляет узлы, выбранные выражением CSS, заданным в качестве аргумента. |
экстракт ()
Возвращает строку в юникоде вместе с выбранными данными.
Re ()
Возвращает список строк Unicode, извлеченный, когда регулярное выражение было задано в качестве аргумента.
XPath ()
Он возвращает список селекторов, который представляет узлы, выбранные выражением xpath, заданным в качестве аргумента.
CSS ()
Он возвращает список селекторов, который представляет узлы, выбранные выражением CSS, заданным в качестве аргумента.
Использование селекторов в оболочке
Чтобы продемонстрировать селекторы с помощью встроенной оболочки Scrapy, в вашей системе должен быть установлен IPython . Здесь важно то, что URL должны быть включены в кавычки при запуске Scrapy; в противном случае URL с символами ‘&’ не будут работать. Вы можете запустить оболочку с помощью следующей команды в каталоге верхнего уровня проекта —
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
Оболочка будет выглядеть следующим образом —
[ ... Scrapy log here ... ] 2014-01-23 17:11:42-0400 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>(referer: None) [s] Available Scrapy objects: [s] crawler <scrapy.crawler.Crawler object at 0x3636b50> [s] item {} [s] request <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> [s] response <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> [s] settings <scrapy.settings.Settings object at 0x3fadc50> [s] spider <Spider 'default' at 0x3cebf50> [s] Useful shortcuts: [s] shelp() Shell help (print this help) [s] fetch(req_or_url) Fetch request (or URL) and update local objects [s] view(response) View response in a browser In [1]:
При загрузке оболочки вы можете получить доступ к телу или заголовку, используя соответственно response.body и response.header . Аналогично, вы можете выполнять запросы к ответу, используя response.selector.xpath () или response.selector.css () .
Например —
In [1]: response.xpath('//title') Out[1]: [<Selector xpath = '//title' data = u'<title>My Book - Scrapy'>] In [2]: response.xpath('//title').extract() Out[2]: [u'<title>My Book - Scrapy: Index: Chapters</title>'] In [3]: response.xpath('//title/text()') Out[3]: [<Selector xpath = '//title/text()' data = u'My Book - Scrapy: Index:'>] In [4]: response.xpath('//title/text()').extract() Out[4]: [u'My Book - Scrapy: Index: Chapters'] In [5]: response.xpath('//title/text()').re('(\w+):') Out[5]: [u'Scrapy', u'Index', u'Chapters']
Извлечение данных
Чтобы извлечь данные с обычного HTML-сайта, мы должны проверить исходный код сайта, чтобы получить XPath. После проверки вы увидите, что данные будут в теге ul . Выберите элементы внутри тега li .
Следующие строки кода показывают извлечение различных типов данных —
Для выбора данных в теге li —
response.xpath('//ul/li')
Для выбора описания —
response.xpath('//ul/li/text()').extract()
Для выбора заголовков сайта —
response.xpath('//ul/li/a/text()').extract()
Для выбора ссылок сайта —
response.xpath('//ul/li/a/@href').extract()
Следующий код демонстрирует использование вышеуказанных экстракторов —