Piton

Raščlanjivanje HTML-a pomoću Pythona

Raščlanjivanje HTML-a pomoću Pythona
Raščlanjivanje HTML-a jedan je od najčešćih zadataka koji se danas obavlja za prikupljanje podataka s web stranica i njihovo razminiranje u razne svrhe, poput utvrđivanja cjenovnih performansi proizvoda tijekom vremena, recenzija knjige na web mjestu i još mnogo toga. U Pythonu postoji mnogo knjižnica poput BeautifulSoup koja apstrahira toliko bolnih točaka u raščlanjivanju HTML-a, ali vrijedi znati kako te knjižnice zapravo rade ispod tog sloja apstrakcije.

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.

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 HTMLParser
klasa 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 HTMLParser
iz 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 (''"http: // www.w3.org / TR / html4 / stroga.dtd "> ')

Evo što smo dobili natrag s ovim pozivom:

DOCTYPE niz

Pokušajmo sada s oznakom slike i pogledajte koje podatke ona izdvaja:

parser.feed ('Pythonov logotip')

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.

Vodič za OpenTTD
OpenTTD je jedna od najpopularnijih igara za poslovnu simulaciju. U ovoj igri morate stvoriti prekrasan prijevoznički posao. Međutim, počet ćete u poč...
SuperTuxKart za Linux
SuperTuxKart sjajan je naslov osmišljen kako bi vam besplatno pružio iskustvo Mario Kart na vašem Linux sustavu. Prilično je izazovno i zabavno igrati...
Vodič za bitku za Wesnoth
Bitka za Wesnoth jedna je od najpopularnijih strateških igara otvorenog koda koje trenutno možete igrati. Ne samo da se ova igra razvija već jako dugo...