U ovoj lekciji to je ono što namjeravamo učiniti. Saznat ćemo kako se vrijednosti različitih HTML oznaka mogu izdvojiti i također nadjačati zadane funkcije ovog modula kako bismo dodali vlastitu logiku. To ćemo učiniti pomoću HTMLParser razred u Pythonu u html.parser modul. Pogledajmo kod na djelu.
Gledajući klasu HTMLParser
Za raščlanjivanje HTML teksta u Pythonu možemo se poslužiti HTMLParser razred u html.parser modul. Pogledajmo definiciju klase za HTMLParser razred:
razred html.parser.HTMLParser (*, convert_charrefs = True)The convert_charrefs Ako je postavljeno na True, sve reference na znakove pretvorit će se u njihove ekvivalente u Unicodeu. Samo skripta / stil elementi se ne pretvaraju. Sada ćemo pokušati razumjeti svaku funkciju za ovu klasu kako bismo bolje razumjeli što svaka funkcija radi.
- handle_startendtag Ovo je prva funkcija koja se aktivira kada se HTML niz prosljedi instanci klase. Jednom kad tekst stigne ovdje, kontrola se prenosi na druge funkcije u klasi koja se sužava na druge oznake u nizu. To je također jasno u definiciji ove funkcije: def handle_startendtag (self, tag, attrs):
sebe.handle_starttag (oznaka, atributi)
sebe.handle_endtag (oznaka) - handle_starttag: Ova metoda upravlja startnom oznakom za podatke koje prima. Njegova je definicija prikazana dolje: def handle_starttag (self, tag, attrs):
proći - handle_endtag: Ova metoda upravlja završnom oznakom za podatke koje prima: def handle_endtag (self, tag):
proći - handle_charref: Ova metoda upravlja referencama znakova u podacima koje prima. Njegova je definicija prikazana dolje: def handle_charref (self, name):
proći - handle_entityref: Ova funkcija rukuje referencama entiteta u HTML-u koji joj je proslijeđen: def handle_entityref (self, name):
proći - podaci_upravljača: Ovo je funkcija u kojoj se obavlja stvarni posao izvlačenja vrijednosti iz HTML oznaka i prosljeđuju se podaci koji se odnose na svaku oznaku. Njegova je definicija prikazana dolje: def handle_data (self, data):
proći - handle_comment: Korištenjem ove funkcije također možemo dobiti komentare u prilogu HTML izvora: def handle_comment (self, data):
proći - handle_pi: Kako HTML također može imati upute za obradu, ovo je funkcija u kojoj su ove njegove definicije prikazane dolje: def handle_pi (self, data):
proći - ručka_decl: Ova metoda obrađuje deklaracije u HTML-u, njena definicija je dana: def handle_decl (self, decl):
proći
Podrazred klase HTMLParser
U ovom ćemo odjeljku podklasirati klasu HTMLParser i pogledati neke funkcije koje se pozivaju kada se HTML podaci prosljeđuju instanci klase. Napišimo jednostavnu skriptu koja sve ovo čini:
iz html-a.parser import HTMLParserklasa LinuxHTMLParser (HTMLParser):
def handle_starttag (self, tag, attrs):
print ("Pronađena je početna oznaka:", oznaka)
def handle_endtag (self, tag):
print ("Pronađena je krajnja oznaka:", oznaka)
def handle_data (self, podaci):
ispis ("Podaci pronađeni:", podaci)
parser = LinuxHTMLParser ()
parser.feed ("
'
Python HTML modul za raščlanjivanje
')
Evo što vraćamo ovom naredbom:
Python HTMLParser potklasa
Funkcije HTMLParser
U ovom ćemo odjeljku raditi s raznim funkcijama klase HTMLParser i pogledati funkcionalnost svake od njih:
iz html-a.parser uvoz HTMLParseriz html-a.entiteti uvoze name2codepoint
klasa LinuxHint_Parse (HTMLParser):
def handle_starttag (self, tag, attrs):
ispis ("Start tag:", tag)
za attr u attrs:
ispis ("attr:", attr)
def handle_endtag (self, tag):
ispis ("Krajnja oznaka:", oznaka)
def handle_data (self, podaci):
ispis ("Podaci:", podaci)
def handle_comment (self, podaci):
ispis ("Komentar:", podaci)
def handle_entityref (ja, ime):
c = chr (name2codepoint [ime])
print ("Imenovani ent:", c)
def handle_charref (ja, ime):
ako ime.započinje s ('x'):
c = chr (int (ime [1:], 16))
drugo:
c = chr (int (ime))
ispis ("Num ent:", c)
def handle_decl (self, podaci):
ispis ("Decl:", podaci)
parser = LinuxHint_Parse ()
Uz razne pozive, dopustimo da ovoj instanci dostavimo odvojene HTML podatke i vidimo kakav izlaz ovi pozivi generiraju. Počet ćemo s jednostavnim DOKTIP niz:
parser.feed (' ')Evo što smo dobili natrag s ovim pozivom:
DOCTYPE niz
Pokušajmo sada s oznakom slike i pogledajte koje podatke ona izdvaja:
parser.feed ('')Evo što smo dobili natrag s ovim pozivom:
Oznaka slike HTMLParser
Zatim, pokušajmo kako se oznaka skripte ponaša s Python funkcijama:
parser.feed ('')parser.feed ('')
parser.feed ('# python boja: zelena')
Evo što smo dobili natrag s ovim pozivom:
Oznaka skripte u htmlparseru
Na kraju, komentare prosljeđujemo i u odjeljak HTMLParser:
parser.feed ('''')
Evo što smo dobili natrag s ovim pozivom:
Raščlanjivanje komentara
Zaključak
U ovoj smo lekciji pogledali kako možemo raščlaniti HTML pomoću vlastite klase Python HTMLParser bez ikakve druge biblioteke. Kôd možemo lako izmijeniti kako bismo promijenili izvor HTML podataka u HTTP klijent.
Ovdje pročitajte više postova temeljenih na Pythonu.