Scrapy con selettori XPath

Scrapy con selettori XPath
HTML è la lingua delle pagine Web e ci sono molte informazioni appese tra l'apertura e la chiusura di ogni pagina web html etichetta. Ci sono molti modi per accedervi, tuttavia in questo articolo lo faremmo usando il selettore XPath tramite la biblioteca di Scrapy di Python.

La libreria di Scrapy è una libreria di raschiatura web molto potente, facile da usare anche. Se sei nuovo in questo, puoi seguire il tutorial disponibile sull'uso della libreria Scrapy.

Questo tutorial copre l'uso di selettori XPath. XPath utilizza un percorso come la sintassi per navigare nei nodi di documenti XML. Sono anche utili nella navigazione di tag HTML.

A differenza del tutorial di Scrapy, faremo tutte le nostre operazioni qui sul terminale per la semplicità. Ciò non significa che l'XPATH non possa essere utilizzato con il programma di Scrapy corretto, tuttavia, possono essere utilizzati nella libreria di Parse sul parametro di risposta.

Lavoreremo con l'esempio.Webscraping.com sito, poiché è molto semplice e aiuterebbe a capire i concetti.

Per utilizzare Scrapy nel nostro terminale, digita il comando seguente:

$ scrapy shell http: // esempio.Webscraping.com

Visiterebbe il sito e avrebbe ottenuto le informazioni necessarie, quindi lasciaci con una shell interattiva con cui lavorare. Dovresti vedere un prompt come:

In 1]:

Dalla sessione interattiva, lavoreremo con il risposta oggetto.

Ecco come sarebbe la nostra sintassi per la maggior parte di questo articolo:

In [1]: risposta.xpath ('xpathsyntax').estratto()

Questo comando sopra viene utilizzato per estrarre tutti i tag abbinati in base alla sintassi XPath e quindi lo memorizza in un elenco.

In [2]: risposta.xpath ('xpathsyntax').extract_first ()

Questo comando sopra viene utilizzato per estrarre solo il primo tag abbinato e lo memorizza in un elenco.
Ora possiamo iniziare a lavorare sulla sintassi XPath.

Tag di navigazione

I tag di navigazione in XPath è molto semplice, tutto ciò che è necessario è il "/" in avanti-slash seguito dal nome del tag.

In [3]: risposta.xpath ('/html').estratto()

Il comando sopra restituirebbe il html Tag e tutto ciò che contiene come un singolo elemento in un elenco.

Se vogliamo ottenere il corpo della pagina Web, useremmo quanto segue:

In [4]: ​​risposta.XPath ('/html/body').estratto()

XPath consente anche al carattere jolly "*", che corrisponde a tutto nel livello in cui viene utilizzato.

In [5]: risposta.xpath ('/*').estratto()

Il codice sopra corrisponderebbe a tutto nel documento. La stessa cosa accade quando usiamo '/html'.

In [6]: risposta.xpath ('/html/*').estratto()

ASIDES che naviga i tag, possiamo ottenere tutti i tag discendenti di un tag particolare usando il "//".

In [7]: risposta.xpath ('/html // a').estratto()

Il codice sopra restituirebbe tutti i tag di ancoraggio sotto il tag HTML i.e. Restituirebbe un elenco di tutti i tag di ancoraggio discendente.

Tag per attributi e loro valori

A volte, la navigazione di tag HTML per raggiungere il tag richiesto potrebbe essere un problema. Questo problema può essere evitato semplicemente trovando il tag necessario con il suo attributo.

In [8]: risposta.xpath ('/html // div [@id = "pagination"]').estratto()

Il codice sopra restituisce tutto il div tag sotto il html tag che ha il id attributo con un valore di impaginazione.

In [9]: risposta.XPath ('/html // div [@class = "span12"]').estratto()

Il codice sopra restituirebbe un elenco di tutti i div Tag sotto il tag HTML, solo se hanno l'attributo di classe con un valore di Span12.

E se non conosci il valore dell'attributo? E tutto ciò che vuoi è ottenere tag con un attributo particolare, senza preoccupazione per il suo valore. Fare questo è anche semplice, tutto ciò che devi fare è usare solo il simbolo @ e l'attributo.

In [10]: risposta.xpath ('/html // div [@class]'.estratto()

Questo codice restituirebbe un elenco di tutti i tag DIV che contengono l'attributo della classe indipendentemente dal valore che quell'attributo di classe contiene.

Che ne dici se conosci solo un paio di caratteri contenuti nel valore di un attributo? È anche possibile ottenere quel tipo di tag.

In [11]: risposta.xpath ('/html // div [contiene (@id, "ion")]').estratto()

Il codice sopra restituirebbe tutti i tag DIV nell'ambito del tag HTML che hanno l'attributo ID, tuttavia non sappiamo quale valore vale l'attributo, tranne per il fatto che sappiamo che contiene "ione".

La pagina che stiamo analizzando ha un solo tag in questa categoria e il valore è "paginazione", quindi sarebbe restituito.

Fresco a destra?

Tag dal loro testo

Ricorda che abbiamo abbinato i tag per i loro attributi prima. Possiamo anche abbinare i tag dal loro testo.

In [12]: risposta.XPath ('/html // a [.= "Algeria"] ').estratto()

Il codice sopra ci aiuterebbe a ottenere tutti i tag di ancoraggio con il testo "Algeria". NB: devono essere tag con esattamente quel contenuto di testo.

Meraviglioso.

Che ne dici se non lo sappiamo nel contenuto esatto del testo e conosciamo solo alcuni dei contenuti di testo? Possiamo farlo anche noi.

In [13]: risposta.xpath ('/html // a [contiene (text (), "a")]').estratto()

Il codice sopra otterrebbe i tag che hanno la lettera "A" nel loro contenuto di testo.

Estrazione del contenuto di tag

Da sempre, abbiamo parlato di trovare i tag giusti. È tempo di estrarre il contenuto del tag quando lo troviamo.

È piuttosto semplice. Tutto quello che dobbiamo fare è aggiungere "/text ()" alla sintassi e il contenuto del tag verrebbe estratto.

In [14]: risposta.xpath ('/html // a/text ()').estratto()

Il codice sopra otterrebbe tutti i tag di ancoraggio nel documento HTML e quindi estrarre il contenuto di testo.

Estrarre i collegamenti

Ora che sappiamo come estrarre il testo in tag, allora dovremmo sapere come estrarre i valori degli attributi. La maggior parte delle volte, i valori degli attributi che sono della massima importanza per noi sono collegamenti.

In questo modo è quasi uguale all'estrazione dei valori di testo, tuttavia invece di usare "/text ()" useremmo il simbolo "/@" e il nome dell'attributo.

In [15]: risposta.xpath ('/html // a/@href').estratto()

Il codice sopra estrarrebbe tutti i collegamenti nei tag di ancoraggio, i collegamenti dovrebbero essere i valori del Href attributo.

Navigazione etichette di fratelli

Se l'hai notato, abbiamo navigato tag per tutto questo. Tuttavia, c'è una situazione che non abbiamo affrontato.

Come selezioniamo un tag particolare quando i tag con lo stesso nome sono allo stesso livello?




Afghanistan




Isole Aland


In un caso come quello che abbiamo sopra, se vogliamo guardarlo, potremmo dire che useremmo extract_first () Per ottenere la prima partita.

Tuttavia, cosa succede se vogliamo abbinare il secondo? E se ci fossero più di dieci opzioni e vogliamo il quinto? Risponderemo adesso.

Ecco la soluzione: quando scriviamo la nostra sintassi XPath, inseriamo la posizione del tag che vogliamo tra parentesi quadrate, proprio come stiamo indicizzando ma l'indice inizia a 1.

Guardando l'HTML della pagina Web con cui abbiamo a che fare, noteresti che c'è molto Tag allo stesso livello. Per ottenere il terzo Tag, useremmo il seguente codice:

In [16]: risposta.XPath ('/html // tr [3]').estratto()

Noteresti anche che il I tag sono in due, se vogliamo solo il secondo tag dal righe che faremmo quanto segue:

In [17]: risposta.XPath ('/html // td [2]').estratto()

CONCLUSIONE:

XPath è un modo molto potente per analizzare i file HTML e potrebbe aiutare a ridurre al minimo l'uso di espressioni regolari nell'analisi loro considerando che ha il contiene funzione nella sua sintassi.

Esistono altre librerie che consentono l'analisi con XPath come Selenio per l'automazione web. XPath ci offre molte opzioni durante l'analisi HTML, ma ciò che è stato trattato in questo articolo dovrebbe essere in grado di trasportarti attraverso le comuni operazioni di analisi HTML.