Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HTML解析_Java_Html_Parsing_Web Scraping - Fatal编程技术网

Java HTML解析

Java HTML解析,java,html,parsing,web-scraping,Java,Html,Parsing,Web Scraping,我正在开发一个应用程序,它可以从网站上抓取数据,我想知道我应该如何获取数据。具体地说,我需要包含在许多使用特定CSS类的div标记中的数据——目前(出于测试目的),我只是在检查 div class = "classname" 在HTML的每一行中,这都是可行的,但我忍不住觉得有更好的解决方案 有没有什么好方法可以让我给一个类一行HTML,并有一些好方法,比如: boolean usesClass(String CSSClassname); String getText(); String ge

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

div class = "classname"
在HTML的每一行中,这都是可行的,但我忍不住觉得有更好的解决方案

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

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

如果您的HTML格式良好,您可以轻松地使用XML解析器来完成这项工作。。。如果您只是在阅读,这将是一个理想的选择。

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

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

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

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

下面是一个示例代码,用于获取使用某个类的所有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();
        }
    }
}
import java.io.IOException;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
导入org.htmlcleaner.htmlcleaner;
导入org.htmlcleaner.TagNode;
/**
*@作者费尔南多·米盖雷斯·帕洛莫
*/
公共类TestHtmlParse
{
静态最终字符串className=“tags”;
静态最终字符串url=”http://www.stackoverflow.com";
标记节点根节点;
公共TestHtmlPase(URL htmlPage)引发IOException
{
HtmlCleaner cleaner=新的HtmlCleaner();
rootNode=cleaner.clean(htmlPage);
}
列表getDivsByClass(字符串CSSClassname)
{
List divList=new ArrayList();
TagNode divElements[]=rootNode.getElementsByName(“div”,true);
对于(int i=0;divElements!=null&&i
几年前,我出于同样的目的使用了JTidy:

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

JTidy是由安迪·奎克(Andy Quick)撰写的,他后来从维护者的位置上退下来。现在,JTidy由一群志愿者维护


关于JTidy的更多信息可以在JTidy SourceForge项目页面上找到。”

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

杰里科:


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

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

该项目是一个优秀的、高性能的HTML解析器,不会在正确性方面偷工减料

nu HTML解析器是HTML 5解析算法在Java中的实现。在已经使用XML解析器支持XHTML1.x内容并使用SAX、DOM或XOM与解析器接口的应用程序中,解析器被设计为XML解析器的替代品。为希望使用脚本执行自己的IO和support document.write()的应用程序提供了低级功能。解析器核心编译在谷歌Web工具包上,并可以自动转换成C++。(C++翻译能力目前用于移植分析器用于GECKO)。 您还可以使用:

它使用并扩展它来生成有效的XHTML1.1内容。

我们不要忘记它的java jQuery:一个快速简洁的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
    }
});
例如:

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
    }
});
doc.form(“#myform”,新的JerryFormHandler(){
公共void onForm(Jerry表单、映射参数){
//工艺形式和参数
}
});

当然,这些只是一些快速的例子,可以让你感觉到这一切是什么样子。

相关:不幸的是,jtidy的速度非常慢。jtidy似乎是一个废弃的项目,已经有几年没有更新了。如果你的HTML格式正确的话。这是真的吗?因为我和其他人一起做项目,其中一些人是设计人员,他们不能创建完美的HTML,而其他很多人也不能,当使用诱惑时,情况就更糟了。这显然是错误的,只有XHTML可以用XML解析器解析。虽然这个链接可以回答这个问题,最好在这里包括答案的基本部分,并提供链接供参考。只有链接的答案才能成为inv