Java的HTMLparsing
我正在从一个网站上刮取数据的应用程序,我想知道如何去获取数据。 具体而言,我需要包含在使用特定CSS类的多个div标签中的数据 – 目前(用于testing目的)我只是检查
div class = "classname"
在HTML的每一行 – 这工作,但我不禁觉得有一个更好的解决scheme。
有什么好的方法,我可以给一个类的HTML一行,并有一些不错的方法,如:
boolean usesClass(String CSSClassname); String getText(); String getLink();
几年前我用JTidy来达到同样的目的:
“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。
前面提到的主要问题是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可能有帮助。 它也做了更多的东西。
我们不要忘记它的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将是理想的。