Java的HTMLparsing

我正在从一个网站上刮取数据的应用程序,我想知道如何去获取数据。 具体而言,我需要包含在使用特定CSS类的多个div标签中的数据 – 目前(用于testing目的)我只是检查

div class = "classname" 

在HTML的每一行 – 这工作,但我不禁觉得有一个更好的解决scheme。

有什么好的方法,我可以给一个类的HTML一行,并有一些不错的方法,如:

 boolean usesClass(String CSSClassname); String getText(); String getLink(); 

几年前我用JTidy来达到同样的目的:

http://jtidy.sourceforge.net/

“JTidy是HTML Tidy的一个Java端口,它是一个HTML语法检查器和漂亮的打印机,就像它的非Java表亲一样,JTidy可以用作清理格式错误和错误的HTML的工具。另外,JTidy提供了一个DOM接口正在处理的文档,这使得您可以使用JTidy作为真实世界HTML的DOMparsing器。

JTidy是由Andy Quick写的,后来从维护者的位置下台。 现在JTidy由一群志愿者维护。

有关JTidy的更多信息,请参见JTidy SourceForge项目页面。“

另一个可能对HTML处理有用的库是jsoup。 Jsoup尝试清理格式不正确的HTML,并允许使用jQuery(如标签select器语法)在Java中进行HTMLparsing。

http://jsoup.org/

前面提到的主要问题是HTML格式不正确,所以必须使用html清理器或HTML-XML转换器。 一旦获得了XML代码(XHTML),就有很多工具可以处理它。 你可以用一个简单的SAX处理程序来获取它,这个处理程序只提取你需要的数据或任何基于树的方法(DOM,JDOM等),甚至可以修改原始代码。

下面是一个示例代码,它使用HTML清理器来获取所有使用某个类的DIV,并打印出其中的所有文本内容。

 import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.htmlcleaner.HtmlCleaner; import org.htmlcleaner.TagNode; /** * @author Fernando Miguélez Palomo <fernandoDOTmiguelezATgmailDOTcom> */ public class TestHtmlParse { static final String className = "tags"; static final String url = "http://www.stackoverflow.com"; TagNode rootNode; public TestHtmlParse(URL htmlPage) throws IOException { HtmlCleaner cleaner = new HtmlCleaner(); rootNode = cleaner.clean(htmlPage); } List getDivsByClass(String CSSClassname) { List divList = new ArrayList(); TagNode divElements[] = rootNode.getElementsByName("div", true); for (int i = 0; divElements != null && i < divElements.length; i++) { String classType = divElements[i].getAttributeByName("class"); if (classType != null && classType.equals(CSSClassname)) { divList.add(divElements[i]); } } return divList; } public static void main(String[] args) { try { TestHtmlParse thp = new TestHtmlParse(new URL(url)); List divs = thp.getDivsByClass(className); System.out.println("*** Text of DIVs with class '"+className+"' at '"+url+"' ***"); for (Iterator iterator = divs.iterator(); iterator.hasNext();) { TagNode divElement = (TagNode) iterator.next(); System.out.println("Text child nodes of DIV: " + divElement.getText().toString()); } } catch(Exception e) { e.printStackTrace(); } } } 

您可能会对TagSoup感兴趣,它是一个能够处理格式错误的HTML的Java HTMLparsing器。 XMLparsing器只能在格式良好的XHTML上工作。

HTMLParser项目( http://htmlparser.sourceforge.net/ )可能是一种可能性。 处理格式错误的HTML似乎相当不错。 以下片段应该做你所需要的:

 Parser parser = new Parser(htmlInput); CssSelectorNodeFilter cssFilter = new CssSelectorNodeFilter("DIV.targetClassName"); NodeList nodes = parser.parse(cssFilter); 

杰里科: http : //jericho.htmlparser.net/docs/index.html

易于使用,支持格式不正确的HTML,很多例子。

HTMLUnit可能有帮助。 它也做了更多的东西。

http://htmlunit.sourceforge.net/ 1

我们不要忘记它的jQuery中的Jerry :一个快速简洁的Java库,它简化了HTML文档的parsing,遍历和操作; 包括使用css3select器。

例:

 Jerry doc = jerry(html); doc.$("div#jodd p.neat").css("color", "red").addClass("ohmy"); 

例:

 doc.form("#myform", new JerryFormHandler() { public void onForm(Jerry form, Map<String, String[]> parameters) { // process form and parameters } }); 

当然,这些只是一些快速的例子,让人感觉如何。

nu.validator项目是一个优秀的,高性能的HTMLparsing器,不会正确地切割angular落。

Validator.nu HTMLparsing器是Java中HTML5parsingalgorithm的一个实现。 parsing器被devise为在XMLparsing器已经支持XHTML 1.x内容并使用SAX,DOM或XOM与parsing器接口的应用程序中作为XMLparsing器的插入replace。 为希望执行自己的IO并通过脚本支持document.write()的应用程序提供了低级function。 parsing器核心编译在Google Web Toolkit上,可以自动翻译成C ++。 (C ++翻译function目前用于移植在Gecko中使用的parsing器。)

你也可以使用XWiki HTML Cleaner :

它使用HTMLCleaner并将其扩展以生成有效的XHTML 1.1内容。

如果您的HTML格式良好,您可以轻松地使用XMLparsing器为您完成这项工作…如果您只是阅读, SAX将是理想的。