Scrapy

Scrapy con i selettori XPath

Scrapy con i selettori XPath
L'HTML è il linguaggio delle pagine web e ci sono molte informazioni sospese 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 attraverso la libreria Scrapy di Python.

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

Questo tutorial copre l'uso dei selettori XPath. XPath usa il percorso come sintassi per navigare i nodi dei documenti XML. Sono anche utili nella navigazione dei tag HTML.

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

Lavoreremo con l'esempio.raschiatura.com, in quanto è molto semplice e aiuterebbe a capire i concetti.

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

$ scrapy shell http://esempio.raschiatura.come

Visiterebbe il sito e otterrebbe le informazioni necessarie, quindi ci lascerebbe 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 corrispondenti secondo la sintassi XPath e quindi memorizzarlo in un elenco.

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

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 di XPath.

TAG DI NAVIGAZIONE

La navigazione tra i tag in XPath è molto semplice, tutto ciò che serve è la barra "/" seguita 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, useremo quanto segue:

In [4]: ​​risposta.xpath('/html/corpo').estratto()

Xpath consente anche il 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()

Oltre ai tag di navigazione, possiamo ottenere tutti i tag discendenti di un particolare tag utilizzando "//".

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

Il codice sopra restituirebbe tutti i tag di ancoraggio sotto nel tag html i.e. restituirebbe un elenco di tutti i tag di ancoraggio discendenti.

TAG PER ATTRIBUTI E LORO VALORI

A volte, la navigazione nei tag html per arrivare al tag richiesto potrebbe essere un problema. Questo problema può essere evitato semplicemente trovando il tag necessario dal suo attributo.

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

Il codice sopra restituisce tutti i div tag sotto il html tag che hanno 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 class con un valore di span12.

Cosa succede se non si conosce il valore dell'attributo? E tutto ciò che vuoi è ottenere tag con un particolare attributo, senza preoccuparti del suo valore. Anche fare questo è semplice, tutto quello 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 class indipendentemente dal valore che contiene l'attributo class.

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 sotto il tag html che hanno l'attributo id, tuttavia non sappiamo quale valore contiene l'attributo tranne che sappiamo che contiene "ion".

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

Bello vero?

TAG CON IL LORO TESTO

Ricorda che in precedenza abbiamo abbinato i tag in base ai loro attributi. Possiamo anche abbinare i tag in base al loro testo.

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

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

Meraviglioso.

Che ne dici se non conosciamo l'esatto contenuto del testo e ne conosciamo solo alcuni?? 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 CONTENUTO TAG

Abbiamo sempre parlato di trovare i tag giusti. È ora di estrarre il contenuto del tag quando lo troviamo.

È piuttosto semplice. Tutto ciò che dobbiamo fare è aggiungere "/text()" alla sintassi e il contenuto del tag verrà estratto.

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

Il codice sopra otterrebbe tutti i tag di ancoraggio nel documento html, quindi estrae il contenuto del testo.

ESTRAZIONE DEI LINK

Ora che sappiamo come estrarre il testo nei tag, 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 i collegamenti.

Fare questo è quasi come estrarre i 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 estrae tutti i collegamenti nei tag di ancoraggio, i collegamenti dovrebbero essere i valori del href attributo.

NAVIGAZIONE TAG FRATELLI

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

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




Afghanistan




Isole Aland


In un caso come quello che abbiamo sopra, se dovessimo guardarlo, potremmo dire che useremmo estratto_primo() per ottenere la prima partita.

Tuttavia, cosa succede se vogliamo abbinare il secondo?? E se ci sono più di dieci opzioni e vogliamo la quinta?? Stiamo per rispondere a questo in questo momento.

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

Guardando l'html della pagina web di cui ci occupiamo, noteresti che ce ne sono molte 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 a due a due, se vogliamo solo il secondo tag da righe 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 considerando che ha il contiene funzione nella sua sintassi.

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

I migliori giochi di laboratorio dell'app Oculus
Se possiedi un visore Oculus, devi essere informato sul sideloading. Il sideloading è il processo di installazione di contenuti non archiviati sul vis...
I 10 migliori giochi da giocare su Ubuntu
La piattaforma Windows è stata una delle piattaforme dominanti per i giochi a causa dell'enorme percentuale di giochi che si stanno sviluppando oggi p...
I 5 migliori giochi arcade per Linux
Al giorno d'oggi, i computer sono macchine serie utilizzate per i giochi. Se non riesci a ottenere il nuovo punteggio più alto, saprai cosa intendo. I...