© 2013 All rights reserved.
1

Java: Html parser

Html parser je program, který dokáže analyzovat HTML kód a dokáže jej rozebrat na jednotlivé části, tagy, a text.

Naprogramovat kvalitní HTML parser může být problém. Parser musí projít HTML dokument, tento dokument analyzovat a rozebrat. Určitě si dokážete představit jak je takový algoritmus složitý.

V javě existuje pro tuto problematiku již hotové řešení v podobě HTMLEditorKit.ParserCallback, který se nachází v javax.swing.text.

Použití ParserCallback si ukážeme nejlépe na příkladu.

Class ParseHtml

Naprogramujeme si třídu ParseHtml, která bude dědit HTMLEditorKit.ParserCallback adokáže analyzovat HTML kód a informace přehledně vypsat. Dokáže vypsat:

  • začátek tagu
  • konec tagu
  • atributy, které tag obsahuje
  • samostatný text
  • html poznámky
  • chyby při parsování

Metody pro všechny tyto operace jsou již v ParserCallback implementovány, takže je stačí použít.

Jako první vytvoříme konstruktor, který bude obsahovat dva vstupní parametry. Url adresu, kterou chceme parsovat a kódování, ve kterém bude html dokument načten.

V konstruktoru vytvoříme public proměnné a pro URL adresu provedeme jednouduchou kontrolu:

Tím máme hotový základ, který pouze vytvoří proměnné a provede jednoducou kontrolu.

Co musíme uděla nyní je připojit se k dané URL adrese. Z url adresy si tedy vytvoříme proměnnou typu URL a nezbývá než vytvořit BufferedReader.
Pro tuto operaci si vytvoříme novou metodu, jejíž volání přidáme do konstruktoru:

Pokud je URL adresa otevřena voláme metodu parse, do které předáme jako parametr BufferedReader. Metoda parser vypadá následovně:

Vytvoříme nový ParserDelegator a začneme parsovat. Pro přístupu k jednotlivým informacím o HTML dokumentu nám slouží impmentované metody.

HhndleText

První z několika metod je handleText. Slouží pro odchycení textu, který se nachází mimo HTML značky. Vstupní parametry jsou zde pouze dva. Text a jeho pozice v dokumentu.

Použití může být obdobné tomuto:

handleComment

Metoda handleComment umožňuje přístup k html komentářům. Vstupní parametry jsou obdobné jako u textu, a to text komentáře a pozice v dokumentu.

Opět jednoduché použití:

handleStartTag

Určitě užitečná a zajímavá metoda je handleStartTag, která dokáže informovat o začátku nového tagu a navíc dokáže odchytit i atributy, které jsou v tagu umístěny:

handleEndTag

K metodě handleStartTag musí existovat i metoda handleEndTag, která na rozdíl od první metody dokáže zjistit ukončení tagu. Vstupní parametry jsou v tomto případě pouze dva a to HTML.Tag a pozice v dokumentu:

handleSimpleTag

Metoda handleStartTag informuje pouze o přítomnosti tagu, který je párový. Neinformuje o tagu jako je například BR, IMG, HR a podobně, které párové nejsou.

Pro tuto potřebu je zde metoda handleSimpleTag. Metoda obsahuje stejně jako handleStartTag tři parametry:

handleError

Pokud při parsování nastane jakýkoli problém, dokáže nás o tom informovat metoda handleError. Jako parametry jsou String ve tvaru chyby a pozice v dokumentu:

Výstup třídy nás dokáže podrobně informovat o celé struktuře html dokumentu:

Protože známe atributy, nebyl by problém zjistit například veškeré url adresy, které daná HTML stránka obsahuje:

nebo podobným způsobem hodnoty jiných atributů.

Nakonec kód celé třídy pro parsování:

Comments (1)

Dobrý den, chci se zeptat, jak bych vypsala pouze text mezi tagy <h2> a </h2>?? děkuji

Add comment

About
Hi, i am programmer from the Czech Republic. I love web development (Ruby, Ruby on Rails, PHP, Nette) and iOS development (Objective-C, Cocoa).
To cooperate, here is my phone:
+420 608 836