Scrapy - Selettori

Descrizione

Quando stai raschiando le pagine web, devi estrarre una certa parte del sorgente HTML usando il meccanismo chiamato selectors, ottenuto utilizzando espressioni XPath o CSS. I selettori si basano sulxml libreria, che elabora XML e HTML in linguaggio Python.

Usa il seguente frammento di codice per definire diversi concetti di selettori:

<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>

Costruire i selettori

È possibile costruire le istanze della classe selector passando il text o TextResponseoggetto. In base al tipo di input fornito, il selettore sceglie le seguenti regole:

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

Usando il codice sopra, puoi costruire dal testo come -

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

Visualizzerà il risultato come:

[u'Hello world!!!']

Puoi costruire dalla risposta come:

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

Visualizzerà il risultato come:

[u'Hello world!!!']

Utilizzo dei selettori

Utilizzando il semplice frammento di codice sopra, è possibile costruire l'XPath per selezionare il testo definito nel tag del titolo come mostrato di seguito -

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

Ora puoi estrarre i dati testuali usando il file .extract() metodo mostrato come segue -

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

Produrrà il risultato come:

[u'My Website']

È possibile visualizzare il nome di tutti gli elementi mostrati come segue:

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

Visualizzerà gli elementi come:

Link 1
Link 2
Link 3

Se vuoi estrarre il primo elemento, usa il metodo .extract_first(), mostrato come segue -

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

Mostrerà l'elemento come -

Link 1

Selettori di annidamento

Utilizzando il codice precedente, è possibile nidificare i selettori per visualizzare il collegamento alla pagina e l'origine dell'immagine utilizzando l'estensione .xpath() metodo, mostrato come segue:

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

Visualizzerà il risultato come:

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']

Selettori che utilizzano espressioni regolari

Scrapy consente di estrarre i dati utilizzando espressioni regolari, che utilizza l'estensione .re()metodo. Dal codice HTML sopra, estrarremo i nomi delle immagini mostrati come segue:

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

La riga sopra mostra i nomi delle immagini come -

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

Utilizzo di XPath relativi

Quando lavori con XPaths, che inizia con il /, i selettori annidati e XPath sono correlati al percorso assoluto del documento e non al percorso relativo del selettore.

Se vuoi estrarre il file <p> elementi, quindi ottieni prima tutti gli elementi div -

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

Successivamente, puoi estrarre tutti i file 'p' elementi all'interno, anteponendo all'XPath un punto come .//p come mostrato di seguito -

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

Utilizzo delle estensioni EXSLT

EXSLT è una comunità che rilascia le estensioni per XSLT (Extensible Stylesheet Language Transformations) che converte i documenti XML in documenti XHTML. È possibile utilizzare le estensioni EXSLT con lo spazio dei nomi registrato nelle espressioni XPath come mostrato nella tabella seguente:

Suor n Prefisso e utilizzo Spazio dei nomi
1

re

espressioni regolari

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

2

set

impostare la manipolazione

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

È possibile controllare il formato del codice semplice per l'estrazione dei dati utilizzando le espressioni regolari nella sezione precedente.

Ci sono alcuni suggerimenti XPath, utili quando si usa XPath con i selettori Scrapy. Per ulteriori informazioni, fare clic su questo collegamento .