【问题标题】:parsing a html report file解析html报告文件
【发布时间】:2012-03-03 01:50:08
【问题描述】:

我正在尝试提取某个工具生成的 html 文件的文本内容。 我不能使用普通的 sax 或 dom 解析器,因为 html 格式不正确。

所以我尝试使用 htmlparser http://htmlparser.sourceforge.net/

现在如何提取我需要的节点?

我使用了以下代码,但它不读取节点文本内容。它只是打印带有属性的 tds。我怎样才能获取节点正文?

td colspan="2"
td valign="top" class="titleText"

我想提取谁的正文有一个数字和一个 % 符号

String inputHTML = readFileAsString(filePath);
Parser parser = new Parser();
parser.setInputHTML(inputHTML);
parser.setEncoding("UTF-8");    
NodeList nl = parser.parse(null);
NodeList tds = nl.extractAllNodesThatMatch(new TagNameFilter("td"),true);

for(int i= 0; i < tds.size(); i++) {
    Node node = tds.elementAt(i);
    System.out.println(node.getText());
}       

【问题讨论】:

  • dom解析器可以轻松提取
  • 它给出了异常,因为 html 格式不正确。缺少一些结束标签
  • 没问题,如果标签没有关闭,dom也可以解析,如果没有被接受也没有问题获取数据

标签: java html xml


【解决方案1】:

如果是 HTML,像 Jsoup 这样的 HTML 解析库可以处理 HTML,而且所有这些都可能很糟糕。

【讨论】:

    【解决方案2】:

    如果您阅读了该库的 JavaDocs,您会发现 getText() 应该返回您所看到的内容:http://htmlparser.sourceforge.net/javadoc/org/htmlparser/Node.html#getText()

    我会尝试调用 getChildren();看起来其中一个孩子将是一个 TextNode,它应该包含您要查找的文本。见http://htmlparser.sourceforge.net/javadoc/org/htmlparser/Node.html#getChildren() 和http://htmlparser.sourceforge.net/javadoc/index.html

    完全未经测试的猜测这是如何工作的:

    for(int i= 0; i < tds.size(); i++) {
        Node node = tds.elementAt(i);
        System.out.println(node.getChildren().elementAt(0).getText());
    }   
    

    你当然要先确定 getChildren().elementAt(0) 存在...

    【讨论】:

    • 什么不起作用?你收到错误了吗?如果没有,发生了什么?
    【解决方案3】:
    1. 使用Html cleaner 清理您的代码
    2. 构造 DOM 解析器
    3. 使用 XPath 提取所需的数据

    清理 html 的示例代码。

    private Document clean(String content) throws ParserConfigurationException {
        HtmlCleaner cleaner = new HtmlCleaner();
        TagNode rootNode = cleaner.clean(content);
    
        // convert to DOM
        CleanerProperties properties = new CleanerProperties();
        properties.setOmitComments(true);
        DomSerializer domSerializer = new DomSerializer(properties);
        Document doc = domSerializer.createDOM(rootNode);
        return doc;
    }
    

    现在你有了 DOM 文档,所以你不需要构建 DOM 解析器。

    Element root = doc.getDocumentElement();
    XPath xpath = XPathFactory.newInstance().newXPath();
    

    XPath 文档可以在 here 找到。 例如

    NodeList columns = (NodeList) xpath.evaluate("//view[@name=\"" + viewName + "\"]/column", root, XPathConstants.NODESET);
    

    获取所有view节点,存在于根节点的任何位置,其拥有和属性名为name,值为viewName

    不传递任何作为最后一个属性或传递XPathConstants.STRING 给出匹配节点的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      • 2022-10-18
      • 2013-11-01
      • 2023-03-04
      相关资源
      最近更新 更多