Finne barneknuter med vakker suppe

Finne barneknuter med vakker suppe
Oppgaven med skraping av nettet er en som krever forståelse av hvordan websider er strukturert. For å få den nødvendige informasjonen fra websider, må man forstå strukturen på websider, analysere taggene som inneholder den nødvendige informasjonen og deretter attributtene til disse taggene.

For nybegynnere i skraping av nettet med Beautifules, finner du en artikkel som diskuterer konseptene om skraping av nettet med dette kraftige biblioteket her.

Denne artikkelen er for programmerere, dataanalytikere, forskere eller ingeniører som allerede har ferdighetssettet til å trekke ut innhold fra websider ved hjelp av BeautifulSoup. Hvis du ikke har noen kunnskap om dette biblioteket, anbefaler jeg deg å gå gjennom Beautifules -opplæringen for nybegynnere.

Nå kan vi fortsette - Jeg vil tro at du allerede har dette biblioteket installert. Hvis ikke, kan du gjøre dette ved hjelp av kommandoen nedenfor:

Pip installer BeautifulSoup4

Siden vi jobber med å trekke ut data fra HTML, må vi ha en grunnleggende HTML -side for å øve på disse konseptene på. For denne artikkelen vil vi bruke dette HTML -utdraget for praksis. Jeg skal tilordne følgende HTML -utdrag til en variabel ved hjelp av trippel sitatene i Python.

prøve_content = "" "

Linuxhint



For å lage en uordnet liste brukes UL -taggen:


    Her er en uordnet liste
  • Første alternativ

  • Andre alternativ




For å lage en bestilt liste brukes OL -taggen:


    Her er en bestilt liste
  1. Nummer en

  2. Nummer to



Linux Hint, 2018



"" "

Nå som vi har sortert det, la oss flytte rett inn i å jobbe med Beautiful -biblioteket.

Vi skal benytte oss. Imidlertid må vi analysere strengen vår ved hjelp av Beautifulesoup og deretter tilordne en "Our_soup" -variabel.

Fra BS4 importerer BeautifulSoup som BSO
Our_soup = BSO (Sample_Content, "LXML")

Fremover ville vi jobbe med variabelen “Our_soup” og kalle alle våre attributter eller metoder på den.

På en rask merknad, hvis du ikke allerede vet hva en barneknute er, er det i utgangspunktet en node (tag) som finnes i en annen node. I vårt HTML -utdrag for eksempel er Li -tags barneknuter av både "UL" og "OL" -kodene.

Her er metodene vi vil se på:

  • findchild
  • findbarn
  • innhold
  • barn
  • etterkommere

findChild ():

De findchild Metoden brukes til å finne den første barneknoden til HTML -elementer. For eksempel når vi tar en titt på "ol" eller "ul" -merker, vil vi finne to barns tagger i det. Men når vi bruker findchild metode, den returnerer bare den første noden som barneknute.

Denne metoden kan vise seg å være veldig nyttig når vi bare ønsker å få den første barneknoden til et HTML -element, da det returnerer det nødvendige resultatet med en gang.

Det returnerte objektet er av typen BS4.element.stikkord. Vi kan trekke ut teksten fra den ved å ringe tekstattributtet på den.

Her er et eksempel:

first_child = our_soup.Finn ("Body").finn ("ol")
trykk (First_child.findChild ())

Koden over vil returnere følgende:

  • Nummer en
  • For å få teksten fra taggen, kaller vi tekst attributt på det.

    Som:

    trykk (First_child.findChild ().tekst)

    For å få følgende resultat:

    'Nummer en'
    findchildren ():

    Vi har sett på findchild metode og sett hvordan det fungerer. De findbarn Metoden fungerer på lignende måter, men som navnet tilsier, den finner ikke bare en barneknute, den får alle barneknuter i en tag.

    Når du trenger å få alle barneknuter i en tag, findbarn Metoden er veien å gå. Denne metoden returnerer alle barneknuter i en liste, du kan få tilgang til taggen du velger ved å bruke indeksnummeret.

    Her er et eksempel:

    first_child = our_soup.Finn ("Body").finn ("ol")
    trykk (First_child.findchildren ())

    Dette ville returnere barneknuter i en liste:

    [
  • Nummer en
  • ,
  • Nummer to
  • ]

    For å få den andre barneknuten på listen, vil følgende kode gjøre jobben:

    trykk (First_child.FindChildren () [1])

    For å få følgende resultat:

  • Nummer to
  • Det er alt Beautifulesuppe gir når det gjelder metoder. Imidlertid ender det ikke der. Attributter kan også kalles på våre Beautiful -objekter for å få barnet/barna/etterkommerneen fra et HTML -element.

    Innhold:

    Mens findbarn metoden gjorde den enkle jobben med å trekke ut barneknuter, innhold attributter gjør noe litt annerledes.

    De innhold Attributt returnerer en liste over alt innholdet i et HTML -element, inkludert Children Nodes. Så når du ringer innhold Attributt på et Beautiful -objekt, det ville returnere teksten som strenger og nodene i taggene som en BS4.element.stikkord gjenstand.

    Her er et eksempel:

    first_child = our_soup.Finn ("Body").finn ("ol")
    trykk (First_child.innhold)

    Dette returnerer følgende:

    ["\ n her er en bestilt liste \ n",
  • Nummer en
  • ,
    '\ n',
  • Nummer to
  • , '\ n']

    Som du kan se, inneholder listen teksten som kommer foran en barneknute, barneknuten og teksten som kommer etter barneknuten.

    For å få tilgang til den andre barneknuten, er alt vi trenger å gjøre å benytte seg av indeksnummeret som vist nedenfor:

    trykk (First_child.Innhold [3])

    Dette ville returnere følgende:

  • Nummer to
  • barn:

    Her er en attributt som gjør nesten det samme som innholdsattributtet. Imidlertid har den en liten forskjell som kan gjøre stor innvirkning (for de som tar kodeoptimalisering på alvor).

    Barna -attributtet returnerer også teksten som kommer foran en barneknute, selve barneknuten og teksten som kommer etter barneknuten. Forskjellen her er at den returnerer dem som en generator i stedet for en liste.

    La oss se på følgende eksempel:

    first_child = our_soup.Finn ("Body").finn ("ol")
    trykk (First_child.barn)

    Koden over gir følgende resultater (adressen på maskinen din trenger ikke å samle den nedenfor):

    Som du ser, returnerer den bare generatorens adresse. Vi kan konvertere denne generatoren til en liste.

    Vi kan se dette i eksemplet nedenfor:

    first_child = our_soup.Finn ("Body").finn ("ol")
    Skriv ut (liste (First_child.barn))

    Dette gir følgende resultat:

    ["\ n her er en bestilt liste \ n",
  • Nummer en
  • ,
    '\ n',
  • Nummer to
  • , '\ n']

    etterkommere:

    Mens barn Attributt fungerer på å få bare innholdet i en tag i.e. teksten og noder på første nivå, etterkommere attributtet går dypere og gjør mer.

    De etterkommere Attributt får all teksten og nodene som finnes i barneknuter. Så det returnerer ikke bare barneknuter, den returnerer barnebarnsnoder også.

    Bortsett fra å returnere teksten og taggene, returnerer den også innholdet i taggene som strenger også.

    Akkurat som barn Egenskap, etterkommere Returnerer resultatene som generator.

    Vi kan se dette nedenfor:

    first_child = our_soup.Finn ("Body").finn ("ol")
    trykk (First_child.etterkommere)

    Dette gir følgende resultat:

    Som sett tidligere, kan vi deretter konvertere dette generatorobjektet til en liste:

    first_child = our_soup.Finn ("Body").finn ("ol")
    Skriv ut (liste (First_child.etterkommere))

    Vi vil få listen nedenfor:

    ["\ n her er en bestilt liste \ n",
  • Nummer en
  • ,
    'Nummer én', '\ n',
  • Nummer to
  • , 'Nummer to', '\ n']

    Konklusjon

    Der har du det, fem forskjellige måter å få tilgang til barneknuter i HTML -elementer. Det kan være flere måter, men med metodene og attributtene som er omtalt i denne artikkelen, skal man kunne få tilgang til barneknoden til et hvilket som helst HTML -element.