52

我正在开发一个从网站上抓取数据的应用程序,我想知道我应该如何获取数据。具体来说,我需要包含在许多使用特定 CSS 类的 div 标签中的数据 - 目前(出于测试目的)我只是在检查

div class = "classname"

在 HTML 的每一行中 - 这行得通,但我不禁觉得那里有更好的解决方案。

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

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

11 回答 11

60

另一个可能对 HTML 处理有用的库是 jsoup。Jsoup 尝试清理格式错误的 HTML,并允许在 Java 中使用类似标签选择器语法的 jQuery 解析 html。

http://jsoup.org/

于 2011-05-18T09:33:54.947 回答
20

如前所述,主要问题是 HTML 格式错误,因此必须使用 html 清理器或 HTML-XML 转换器。获得 XML 代码 (XHTML) 后,有很多工具可以处理它。您可以通过一个简单的 SAX 处理程序来获得它,该处理程序只提取您需要的数据,或者任何基于树的方法(DOM、JDOM 等),甚至可以让您修改原始代码。

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

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();
        }
    }
}
于 2008-10-26T14:55:57.303 回答
18

几年前,我出于同样的目的使用了 JTidy:

http://jtidy.sourceforge.net/

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

JTidy 是由 Andy Quick 编写的,后来他辞去了维护者的职位。现在 JTidy 由一群志愿者维护。

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

于 2008-10-26T16:06:03.697 回答
13

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

于 2008-10-26T14:16:42.437 回答
5

HTMLParser 项目 ( http://htmlparser.sourceforge.net/ ) 可能是一种可能性。它在处理格式错误的 HTML 方面似乎相当不错。以下代码段应该可以满足您的需要:

Parser parser = new Parser(htmlInput);
CssSelectorNodeFilter cssFilter = 
    new CssSelectorNodeFilter("DIV.targetClassName");
NodeList nodes = parser.parse(cssFilter);
于 2008-10-26T14:23:12.173 回答
5

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

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

于 2011-01-21T18:36:15.027 回答
4

HTMLUnit 可能会有所帮助。它也做了很多事情。

http://htmlunit.sourceforge.net/ 1

于 2008-10-26T19:16:21.550 回答
4

让我们不要忘记Jerry,它的 jQuery in java:一个快速简洁的 Java 库,简化了 HTML 文档的解析、遍历和操作;包括 css3 选择器的使用。

例子:

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

当然,这些只是一些简单的示例,可以让您感受一下它的样子。

于 2012-01-08T17:37:55.157 回答
3

nu.validator项目是一个出色的高性能 HTML 解析器,在正确性方面不会偷工减料。

Validator.nu HTML Parser 是 HTML5 解析算法的 Java 实现。该解析器旨在作为 XML 解析器的直接替代品,在已经使用 XML 解析器支持 XHTML 1.x 内容并使用 SAX、DOM 或 XOM 与解析器交互的应用程序中工作。为希望执行自己的 IO 并通过脚本支持 document.write() 的应用程序提供了低级功能。解析器核心在 Google Web Toolkit 上编译,可以自动翻译成 C++。(C++ 翻译功能目前用于移植解析器以在 Gecko 中使用。)

于 2011-08-19T00:13:16.177 回答
1

您还可以使用XWiki HTML Cleaner

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

于 2011-10-04T15:54:20.710 回答
0

如果您的 HTML 格式正确,您可以轻松地使用 XML 解析器来为您完成这项工作……如果您只是阅读,SAX将是理想的选择。

于 2008-10-26T14:01:36.413 回答