Analysere HTML ved hjelp av python

Analysere HTML ved hjelp av python
Parsing HTML er en av de vanligste oppgavene som gjøres i dag for å samle informasjon fra nettstedene og gruve den til forskjellige formål, for å etablere prisytelse av et produkt over tid, anmeldelser av en bok på et nettsted og mye mer. Det finnes mange biblioteker som Beautifules i Python som abstraherer bort så mange smertefulle punkter i å analysere HTML, men det er verdt å vite hvordan disse bibliotekene faktisk fungerer under det abstraksjons laget.

I denne leksjonen er det det vi har tenkt å gjøre. Vi vil finne ut hvordan verdier av forskjellige HTML -tagger kan trekkes ut og også overstyre standardfunksjonaliteten til denne modulen for å legge til en egen logikk. Vi vil gjøre dette ved hjelp av HTMLParser klasse i Python i html.analyser modul. La oss se koden i aksjon.

Ser på HTMLParser -klassen

For å analysere HTML -tekst i Python, kan vi benytte oss av HTMLParser klasse i html.analyser modul. La oss se på klassen Dfinition for HTMLParser klasse:

Klasse HTML.analyser.Htmlparser (*, convert_charrefs = true)

De Convert_charrefs Feltet, hvis det er satt til True, vil gjøre alle karakterhenvisningene konvertert til sine Unicode -ekvivalenter. Bare den manus/stil Elementer er ikke konvertert. Nå vil vi prøve å forstå hver funksjon for denne klassen i tillegg til å bedre forstå hva hver funksjon gjør.

  • Handle_startendTag Dette er den første funksjonen som utløses når HTML -streng sendes til klasseforekomsten. Når teksten når hit, sendes kontrollen til andre funksjoner i klassen som smalner ned til andre tagger i strengen. Dette er også klart i definisjonen for denne funksjonen:
    def håndtak_startendTag (selv, tag, attrs):
    selv-.Handle_startTag (tag, attrs)
    selv-.Handle_EndTag (tag)
  • håndtak_starttag: Denne metoden administrerer startkoden for dataene den mottar. Definisjonen er som vist nedenfor:
    def håndtak_starttag (selv, tag, attrs):
    sende
  • håndtak_tendag: Denne metoden administrerer sluttkoden for dataene den mottar:
    def Handle_EndTag (selv, tag):
    sende
  • Handle_charref: Denne metoden administrerer karakterhenvisningene i dataene den mottar. Definisjonen er som vist nedenfor:
    def håndtak_charref (selv, navn):
    sende
  • håndtak_entityref: Denne funksjonen håndterer enhetens referanser i HTML som er gitt til den:
    Def Handle_EntityRef (selv, navn):
    sende
  • håndtak_data: Dette er funksjonen der det gjøres ekte arbeid for å trekke ut verdier fra HTML -kodene og sendes dataene relatert til hver tag. Definisjonen er som vist nedenfor:
    def håndtak_data (selv, data):
    sende
  • håndtak_komment: Ved å bruke denne funksjonen kan vi også få kommentarer knyttet til en HTML -kilde:
    DEF HANDRE_COMMENT (SELV, DATA):
    sende
  • Handle_pi: Ettersom HTML også kan ha behandlingsinstruksjoner, er dette funksjonen der disse definisjonen er som vist nedenfor:
    def håndtak_pi (selv, data):
    sende
  • håndtak_decl: Denne metoden håndterer erklæringene i HTML, dens definisjon er gitt som:
    def håndtak_decl (selv, dekl):
    sende

Underklassing av HTMLParser -klassen

I denne delen vil vi underklasse HTMLParser-klassen og vil se på noen av funksjonene som blir kalt når HTML-data blir sendt til klasseforekomst. La oss skrive et enkelt manus som gjør alt dette:

Fra HTML.Parser Import HTMLParser
Klasse LinuxhtmlParser (HTMLParser):
def håndtak_starttag (selv, tag, attrs):
print ("Start tag møtes:", tag)
def Handle_EndTag (selv, tag):
Print ("End Tag møtes:", tag)
def håndtak_data (selv, data):
Print ("Data funnet:", data)
Parser = LinuxhtmlParser ()
analyser.mate("
'

Python HTML Parsing Module


')

Dette er hva vi kommer tilbake med denne kommandoen:

Python HTMLParser underklasse

HTMLParser fungerer

I dette avsnittet vil vi jobbe med forskjellige funksjoner i HTMLParser -klassen og se på funksjonaliteten til hver av disse:

Fra HTML.Parser Import HTMLParser
Fra HTML.Enheter importerer name2CodePoint
Klasse Linuxhint_Parse (HTMLParser):
def håndtak_starttag (selv, tag, attrs):
Print ("Start tag:", tag)
for attr i attrs:
trykk ("attr:", attr)
def Handle_EndTag (selv, tag):
Print ("End Tag:", tag)
def håndtak_data (selv, data):
Print ("Data:", data)
DEF HANDRE_COMMENT (SELV, DATA):
trykk ("Kommentar:", data)
Def Handle_EntityRef (selv, navn):
C = CHR (Name2CodePoint [navn])
Trykk ("Navnet ENT:", C)
def håndtak_charref (selv, navn):
Hvis navn.Startswith ('x'):
C = Chr (int (navn [1:], 16))
ellers:
C = Chr (int (navn))
Print ("Num Ent:", c)
def håndtak_decl (selv, data):
Print ("Decl:", data)
parser = linuxhint_parse ()

Med forskjellige samtaler, la oss mate separate HTML -data til denne forekomsten og se hvilken utgang disse samtalene genererer. Vi starter med en enkel Doctype streng:

analyser.mate(''"http: // www.W3.org/tr/html4/streng.dtd "> ')

Her er hva vi får tilbake med denne samtalen:

Doctype streng

La oss nå prøve en bildekode og se hvilke data den trekker ut:

analyser.mate('')

Her er hva vi får tilbake med denne samtalen:

HTMLParser Image Tag

La oss deretter prøve hvordan skriptetaggen oppfører seg med Python -funksjoner:

analyser.mate(''
'varsling("Linuxhint Python"); ')
analyser.Feed ('#Python Color: Green')
analyser.Feed ('#Python Color: Green')

Her er hva vi får tilbake med denne samtalen:

Script Tag i HTMLParser

Til slutt gir vi kommentarer til HTMLParser -delen også:

analyser.mate(''
'IE-spesifikt innhold')

Her er hva vi får tilbake med denne samtalen:

Analysere kommentarer

Konklusjon

I denne leksjonen så vi på hvordan vi kan analysere HTML ved hjelp av Python egen HTMLParser -klasse uten noe annet bibliotek. Vi kan enkelt endre koden for å endre kilden til HTML -dataene til en HTTP -klient.

Les mer Python -baserte innlegg her.