Trovare nodi per bambini con una bella zuppa

Trovare nodi per bambini con una bella zuppa
Il compito di Web rashing è quello che richiede la comprensione di come sono strutturate le pagine web. Per ottenere le informazioni necessarie dalle pagine Web, è necessario comprendere la struttura delle pagine Web, analizzare i tag che contengono le informazioni necessarie e quindi gli attributi di tali tag.

Per i principianti nel rashing del web con Beautifulsoup, un articolo che discute dei concetti di raschiatura del web con questa potente biblioteca può essere trovato qui.

Questo articolo è per programmatori, analisti di dati, scienziati o ingegneri che hanno già le competenze di estrazione di contenuti dalle pagine Web utilizzando BeautifulSoup. Se non hai alcuna conoscenza di questa biblioteca, ti consiglio di passare attraverso il tutorial per i principianti.

Ora possiamo procedere - voglio credere che tu abbia già installato questa libreria. In caso contrario, puoi farlo usando il comando qui sotto:

PIP Installa Beautifulsoup4

Dal momento che stiamo lavorando con l'estrazione di dati da HTML, dobbiamo avere una pagina HTML di base per praticare questi concetti su. Per questo articolo, useremmo questo frammento di HTML per la pratica. Assegnerò il seguente snippet HTML a una variabile usando le triple citazioni in Python.

Sample_Content = "" "

Linuxhint



Per creare un elenco non ordinato, viene utilizzato il tag UL:


    Ecco una lista non ordinata
  • Prima opzione

  • Seconda opzione




Per effettuare un elenco ordinato, viene utilizzato il tag OL:


    Ecco un elenco ordinato
  1. Numero uno

  2. Numero due



Linux Sint, 2018



"" "

Ora che l'abbiamo risolto, muoveriamo direttamente a lavorare con la biblioteca di Beautifulsoup.

Faremo uso di un paio di metodi e attributi che chiameremmo sul nostro oggetto per bellissimi. Tuttavia, dovremmo analizzare la nostra stringa usando BeautifulSoup e quindi assegnare a una variabile "OUT_SOUP".

da BS4 Import Beautifulsoup come BSO
Our_Soup = BSO (Sample_Content, "LXML")

D'ora in poi, lavoreremmo con la variabile "OUT_SOUP" e chiameremmo tutti i nostri attributi o metodi su di essa.

In breve, se non sai già cosa sia un nodo figlio, è fondamentalmente un nodo (tag) che esiste all'interno di un altro nodo. Nel nostro frammento HTML Ad esempio, i tag Li sono nodi per bambini sia dei tag "UL" che di "OL".

Ecco i metodi che daremmo un'occhiata:

  • FindChild
  • FindChildren
  • Contenuti
  • bambini
  • discendenti

findChild ():

IL FindChild Il metodo viene utilizzato per trovare il primo nodo figlio di elementi HTML. Ad esempio, quando diamo un'occhiata ai nostri tag "ol" o "UL", troveremmo due tag per bambini. Tuttavia, quando usiamo il FindChild Metodo, restituisce solo il primo nodo come nodo figlio.

Questo metodo potrebbe rivelarsi molto utile quando vogliamo ottenere solo il primo nodo figlio di un elemento HTML, in quanto restituisce subito il risultato richiesto.

L'oggetto restituito è del tipo BS4.elemento.Etichetta. Possiamo estrarre il testo da esso chiamando l'attributo di testo su di esso.

Ecco un esempio:

First_Child = our_soup.Trova ("corpo").Trova ("ol")
Stampa (First_Child.findChild ())

Il codice sopra restituirebbe quanto segue:

  • Numero uno
  • Per ottenere il testo dal tag, chiamiamo il testo attributo su di esso.

    Come:

    Stampa (First_Child.findChild ().testo)

    Per ottenere il seguente risultato:

    'Numero uno'
    findChildren ():

    Abbiamo dato un'occhiata al FindChild metodo e visto come funziona. IL FindChildren Il metodo funziona in modo simile, tuttavia come suggerisce il nome, non trova solo un nodo figlio, ottiene tutti i nodi per bambini in un tag.

    Quando hai bisogno di ottenere tutti i nodi per bambini in un tag, il FindChildren Il metodo è la strada da percorrere. Questo metodo restituisce tutti i nodi per bambini in un elenco, è possibile accedere al tag di tua scelta utilizzando il suo numero indice.

    Ecco un esempio:

    First_Child = our_soup.Trova ("corpo").Trova ("ol")
    Stampa (First_Child.findChildren ())

    Ciò restituirebbe i nodi per bambini in un elenco:

    [
  • Numero uno
  • ,
  • Numero due
  • "

    Per ottenere il secondo nodo figlio nell'elenco, il seguente codice farebbe il lavoro:

    Stampa (First_Child.FindChildren () [1])

    Per ottenere il seguente risultato:

  • Numero due
  • Questo è tutto quello che bellissimo, fornisce quando si tratta di metodi. Tuttavia, non finisce qui. Gli attributi possono anche essere chiamati sui nostri oggetti per bellissimi panorami per ottenere il nodo bambino/bambini/discendente da un elemento HTML.

    Contenuti:

    Mentre il FindChildren Il metodo ha fatto il semplice compito di estrarre i nodi dei bambini, il Contenuti gli attributi fanno qualcosa di un po 'diverso.

    IL Contenuti L'attributo restituisce un elenco di tutto il contenuto in un elemento HTML, inclusi i nodi per bambini. Quindi quando chiami il Contenuti Attributo su un oggetto per bellissimi, restituirebbe il testo come stringhe e nodi nei tag come un BS4.elemento.Etichetta oggetto.

    Ecco un esempio:

    First_Child = our_soup.Trova ("corpo").Trova ("ol")
    Stampa (First_Child.Contenuti)

    Questo restituisce quanto segue:

    ["\ n ecco un elenco ordinato \ n",
  • Numero uno
  • ,
    '\N',
  • Numero due
  • , '\N']

    Come puoi vedere, l'elenco contiene il testo che viene prima di un nodo figlio, il nodo figlio e il testo che viene dopo il nodo figlio.

    Per accedere al secondo nodo figlio, tutto ciò che dobbiamo fare è utilizzare il suo numero indice come mostrato di seguito:

    Stampa (First_Child.contenuto [3])

    Ciò restituirebbe quanto segue:

  • Numero due
  • bambini:

    Ecco un attributo che fa quasi la stessa cosa dell'attributo dei contenuti. Tuttavia, ha una piccola differenza che potrebbe avere un impatto enorme (per coloro che prendono sul serio l'ottimizzazione del codice).

    L'attributo per bambini restituisce anche il testo che viene prima di un nodo figlio, il nodo figlio stesso e il testo che viene dopo il nodo figlio. La differenza qui è che li restituisce come generatore anziché un elenco.

    Diamo un'occhiata al seguente esempio:

    First_Child = our_soup.Trova ("corpo").Trova ("ol")
    Stampa (First_Child.bambini)

    Il codice sopra fornisce i seguenti risultati (l'indirizzo sulla macchina non deve contattare quello sotto):

    Come puoi vedere, restituisce solo l'indirizzo del generatore. Potremmo convertire questo generatore in un elenco.

    Possiamo vederlo nell'esempio seguente:

    First_Child = our_soup.Trova ("corpo").Trova ("ol")
    Stampa (elenco (First_Child.bambini))

    Questo dà il seguente risultato:

    ["\ n ecco un elenco ordinato \ n",
  • Numero uno
  • ,
    '\N',
  • Numero due
  • , '\N']

    Discendenti:

    Mentre il bambini L'attributo funziona per ottenere solo il contenuto all'interno di un tag i.e. il testo e i nodi al primo livello, il discendenti L'attributo va più in profondità e fa di più.

    IL discendenti L'attributo ottiene tutto il testo e i nodi che esistono nei nodi per bambini. Quindi non restituisce solo nodi per bambini, restituisce anche i nodi dei nipoti.

    LASI RETROVANDO IL TESTO E IL TAGS, restituisce anche il contenuto nei tag come stringhe.

    Proprio come il bambini attributo, discendenti restituisce i suoi risultati come generatore.

    Possiamo vederlo di seguito:

    First_Child = our_soup.Trova ("corpo").Trova ("ol")
    Stampa (First_Child.discendenti)

    Questo dà il seguente risultato:

    Come visto in precedenza, possiamo quindi convertire questo oggetto generatore in un elenco:

    First_Child = our_soup.Trova ("corpo").Trova ("ol")
    Stampa (elenco (First_Child.discendenti))

    Otteneremmo l'elenco di seguito:

    ["\ n ecco un elenco ordinato \ n",
  • Numero uno
  • ,
    'Numero uno', '\ n',
  • Numero due
  • , 'Numero due', '\ n']

    Conclusione

    Ecco qua, cinque modi diversi per accedere ai nodi per bambini negli elementi HTML. Potrebbero esserci più modi, tuttavia, con i metodi e gli attributi discussi in questo articolo si dovrebbero essere in grado di accedere al nodo figlio di qualsiasi elemento HTML.