开源Html分析器解析库对比

banq 13-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();
}


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();


jTidy:


final Tidy tidy = new Tidy();
tidy.setQuiet(true);
tidy.setShowWarnings(false);
tidy.setForceOutput(true);
document = tidy.parseDOM(urlIS, null);


HtmlCleaner:

final HtmlCleaner cleaner = new HtmlCleaner(urlIS);
try {
cleaner.clean();
document = cleaner.createDOM();
} catch (Exception e) {
e.printStackTrace();
}


用以上代码做测试抓取文档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>"

详细见:http://jsoup.org/cookbook/extracting-data/attributes-text-html

    

2