【问题标题】:Simplest way to extract information (parsing) from HTML in Java在 Java 中从 HTML 中提取信息(解析)的最简单方法
【发布时间】:2012-02-26 18:09:43
【问题描述】:

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

考虑这个通过 jTidy 解析的 html。我有一个由这段代码的 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 创建一个新的节点列表(大量内存和无聊)。有诸如 Sax、Xerces 等替代品,但我不知道它们的优缺点。

从上面的“jTyded”html 中提取这些信息的最简单(最快)的方法是什么?

【问题讨论】:

标签: java html xml-parsing


【解决方案1】:

首先 - 你忘了添加&lt;table&gt; 标签。

您可以使用 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】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多