Учебники

Scrapy — Селекторы

Когда вы просматриваете веб-страницы, вам нужно извлечь определенную часть исходного кода HTML с помощью механизма селекторов , который достигается с помощью выражений XPath или CSS. Селекторы построены на библиотеке lxml , которая обрабатывает XML и HTML на языке Python.

Используйте следующий фрагмент кода, чтобы определить различные концепции селекторов —

<html>
   <head>
      <title>My Website</title>
   </head>
   
   <body>
      <span>Hello world!!!</span>
      <div class = 'links'>
         <a href = 'one.html'>Link 1<img src = 'image1.jpg'/></a>
         <a href = 'two.html'>Link 2<img src = 'image2.jpg'/></a>
         <a href = 'three.html'>Link 3<img src = 'image3.jpg'/></a>
      </div>
   </body>
</html>

Построение селекторов

Вы можете создать экземпляры класса селектора, передав текст или объект TextResponse . На основе предоставленного типа ввода селектор выбирает следующие правила:

from scrapy.selector import Selector 
from scrapy.http import HtmlResponse

Используя приведенный выше код, вы можете построить из текста как —

Selector(text = body).xpath('//span/text()').extract() 

Он будет отображать результат как —

[u'Hello world!!!'] 

Вы можете построить из ответа как —

response = HtmlResponse(url = 'http://mysite.com', body = body) 
Selector(response = response).xpath('//span/text()').extract()

Он будет отображать результат как —

[u'Hello world!!!']

Использование селекторов

Используя приведенный выше простой фрагмент кода, вы можете создать XPath для выделения текста, который определен в теге title, как показано ниже:

>>response.selector.xpath('//title/text()')

Теперь вы можете извлечь текстовые данные, используя метод .extract (), показанный ниже:

>>response.xpath('//title/text()').extract()

Это даст результат как —

[u'My Website']

Вы можете отобразить имя всех элементов, показанных ниже:

>>response.xpath('//div[@class = "links"]/a/text()').extract() 

Это будет отображать элементы как —

Link 1
Link 2
Link 3

Если вы хотите извлечь первый элемент, используйте метод .extract_first () , показанный ниже:

>>response.xpath('//div[@class = "links"]/a/text()').extract_first()

Он будет отображать элемент как —

Link 1

Вложенные селекторы

Используя приведенный выше код, вы можете вкладывать селекторы для отображения ссылки на страницу и источника изображения, используя метод .xpath () , показанный ниже:

links = response.xpath('//a[contains(@href, "image")]') 

for index, link in enumerate(links): 
   args = (index, link.xpath('@href').extract(), link.xpath('img/@src').extract()) 
   print 'The link %d pointing to url %s and image %s' % args 

Он будет отображать результат как —

Link 1 pointing to url [u'one.html'] and image [u'image1.jpg']
Link 2 pointing to url [u'two.html'] and image [u'image2.jpg']
Link 3 pointing to url [u'three.html'] and image [u'image3.jpg']

Селекторы, использующие регулярные выражения

Scrapy позволяет извлекать данные с помощью регулярных выражений, используя метод .re () . Из приведенного выше HTML-кода мы извлечем имена изображений, показанные ниже:

>>response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')

Выше строка отображает имена изображений в виде —

[u'Link 1', 
u'Link 2', 
u'Link 3'] 

Использование относительных XPath

Когда вы работаете с XPath, который начинается с / , вложенные селекторы и XPath связаны с абсолютным путем документа, а не с относительным путем селектора.

Если вы хотите извлечь элементы <p> , то сначала получите все элементы div —

>>mydiv = response.xpath('//div')

Затем вы можете извлечь все элементы ‘p’ внутри, добавив к XPath точку с точкой .//p, как показано ниже —

>>for p in mydiv.xpath('.//p').extract() 

Использование расширений EXSLT

EXSLT — это сообщество, которое выпускает расширения для XSLT (преобразования языка расширяемой таблицы стилей), который преобразует XML-документы в XHTML-документы. Вы можете использовать расширения EXSLT с зарегистрированным пространством имен в выражениях XPath, как показано в следующей таблице:

Sr.No Префикс и использование Пространство имен
1

ре

регулярные выражения

http://exslt.org/regexp/index.html

2

задавать

манипулирование множеством

http://exslt.org/set/index.html

ре

регулярные выражения

http://exslt.org/regexp/index.html

задавать

манипулирование множеством

http://exslt.org/set/index.html

Вы можете проверить простой формат кода для извлечения данных, используя регулярные выражения в предыдущем разделе.

Есть несколько советов по XPath, которые полезны при использовании XPath с селекторами Scrapy. Для получения дополнительной информации, нажмите на эту ссылку .