開源Html分析器解析庫對比

banq發表於2013-12-05
幾乎所有已知的HTML解析器都是實現W3C DOM API(JAXP的API一部分,用於XML處理),並給你一個org.w3c.dom.Document,便於透過JAXP API直接使用。主要的區別通常是是否能分析有問題的html。大多數解析器是在一定程度上都寬容非結構非完整的HTML,如JTidy,NekoHTML,TagSoup和HtmlCleaner。您通常可以使用這種型別的HTML解析器對付比較“整潔”的HTML源,這樣就可以使用W3C DOM和 JAXP API.

NekoHTML:

final DOMParser parser = new DOMParser();
try {
	parser.parse(new InputSource(urlIS));
	document = parser.getDocument();
} catch (SAXException e) {
	e.printStackTrace();
} catch (IOException e) {
	e.printStackTrace();
}
<p class="indent">


TagSoup:

final Parser parser = new Parser();
SAX2DOM sax2dom = null;
try {
	sax2dom = new SAX2DOM();
	parser.setContentHandler(sax2dom);
	parser.setFeature(Parser.namespacesFeature, false);
	parser.parse(new InputSource(urlIS));
} catch (Exception e) {
	e.printStackTrace();
}
document = sax2dom.getDOM();
<p class="indent">


jTidy:

final Tidy tidy = new Tidy();
tidy.setQuiet(true);
tidy.setShowWarnings(false);
tidy.setForceOutput(true);
document = tidy.parseDOM(urlIS, null);
<p class="indent">


HtmlCleaner:

final HtmlCleaner cleaner = new HtmlCleaner(urlIS);
try {
	cleaner.clean();
	document = cleaner.createDOM();
} catch (Exception e) {
	e.printStackTrace();
}
<p class="indent">


用以上程式碼做測試抓取文件html中連結標籤,贏家是HtmlCleaner,它快速和容易實現。一個缺點HtmlCleaner是,它不提供一個Maven倉庫。


HtmlUnit

HtmlUnit使您能夠像一個在WebBrowser裡面程式設計。輸入表單的值,單擊按鈕,呼叫JavaScript等等。它不只是一個HTML解析器。是一個真正的“圖形介面的web瀏覽器”和HTML的單元測試工具。


Jsoup:
提供一個完全自己的API。它給你像使用jQuery般的CSS選擇器,並提供了一個靈活的API來遍歷HTML DOM樹來獲得感興趣的內容。

HTML DOM樹的遍歷是Jsoup的主要特徵。有過org.w3c.dom.Document打交道的人知道這是多麼痛苦的地獄,可以使用jsoup詳細的NodeList和節點API來遍歷DOM。當然,XPath的使生活更輕鬆,但是它難以學習。

如果你想從通常的現實世界HTML中提取特定資料,Jsoup是選擇。

String html = "<p>An <a href='http://example.com/'><b>example</b></a> link.</p>";
Document doc = Jsoup.parse(html);
Element link = doc.select("a").first();

String text = doc.body().text(); // "An example link"
String linkHref = link.attr("href"); // "http://example.com/"
String linkText = link.text(); // "example""

String linkOuterH = link.outerHtml(); 
    // "<a href="http://example.com"><b>example</b></a>"
String linkInnerH = link.html(); // "<b>example</b>"
<p class="indent">

詳細見:http://jsoup.org/cookbook/extracting-data/attributes-text-html

相關文章