在Java中从HTML中提取信息(解析)的最简单方法

时间:2012-02-26 18:09:43

标签: java html xml-parsing

我已经在有关html解析的stackoverflow上阅读了很多问题。 我已经了解到,在可能的情况下,我们应该避免使用正则表达式并使用解析器。 我知道有很多Html / Xml解析器,但我不知道如何正确使用它们。

考虑这个html,通过jTidy解析。我有一个由此代码的jTidy创建的Document对象:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <!-- Header content -->
</head>
<body>
    <div id="container">
        <div id="id1"> ... </div>
        <div id="id2"> ... </div>
        <div id="mainContent">
            <div id="section 1">
                <div id="subSection">
                    <!-- Interested part -->
                    <tbody>
                        <tr class="success">
                            <td class="fileName"><span>File One</span></td>
                        </tr>
                        <tr class="fail">
                            <td class="fileName"><span>File Two</span></td>
                        </tr>                        
                        <tr class="success">
                            <td class="fileName"><span>File Three</span></td>
                        </tr>
                    </tbody>
                </div>
            </div>
        </div>
    </div>
</body>

现在,我想映射(在Map:D中)每个文件名及其类(成功/失败)。 我可以用DOM来做,但我应该创建一个NodeList,并为每个Element创建一个新的节点列表(大量内存和无聊)。有萨克斯,Xerces等替代品,但我不知道它们的优点/缺点。

从&#34; jTyded&#34;中提取这些信息的最简单(也是最快)的方法是什么?上面的HTML?

3 个答案:

答案 0 :(得分:1)

尝试JSoup

答案 1 :(得分:1)

首先 - 您忘记添加<table>代码。

您可以使用 Jsoup

轻松解析代码

以下是一个例子:

//  String html =" ...here goes your html code... ";
// Document doc = Jsoup.parse(html);
// Or from file:
    File input = new File("com.htm");
    Document doc = Jsoup.parse(input, "UTF-8");
    Elements trs = doc.select("tr"); //select all "tr" elements from document
    for(Element tr:trs){
        //Getting the class string form tr element
        System.out.println("The file class is: " + tr.attr("class") 
       //getting the filename string that holds inside td element
         + " The filamee is: "  + tr.select("td").text());
    }
}

答案 2 :(得分:0)

在我看来,最好的方法是使用XSLT + XPath(正如Greg在评论中建议的那样),以便为unmarshaller生成输入。

所以整个流程如下所示: HTML-&gt; [jTidy purifying] - &gt; XHTL-&gt; [XSLT转换] - &gt;字符串数据表示 - &gt; [JAXB unmarshaller] - &gt; Java对象。

如果您不想生成对象,请使用此线程中描述的XPath:How to read XML using XPath in Java