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 |
|
2 | set impostare la manipolazione |
È 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 .