Java 解析html报告文件

Java 解析html报告文件,java,html,xml,Java,Html,Xml,我正在尝试提取由某个工具生成的html文件的文本内容。 我不能使用普通的sax或dom解析器,因为html格式不正确 所以我试着使用HTMLPasser 现在如何提取所需的节点 我使用了下面的代码,但它不读取节点文本内容。它只打印带有属性的tds。如何获取节点正文 td colspan="2" td valign="top" class="titleText" 我想提取有数字和%符号的主体 String inputHTML = readFileAsString(filePath); Parse

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

所以我试着使用HTMLPasser

现在如何提取所需的节点

我使用了下面的代码,但它不读取节点文本内容。它只打印带有属性的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());
}       

如果是HTML,像Jsoup这样的HTML解析库可以处理HTML和所有可能的不好的东西。

如果您阅读该库的JavaDocs,您将看到getText应该返回您所看到的内容:

我会试着给孩子们打电话;看起来其中一个子节点将是TextNode,它应该包含您要查找的文本。看到和

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

for(int i= 0; i < tds.size(); i++) {
    Node node = tds.elementAt(i);
    System.out.println(node.getChildren().elementAt(0).getText());
}   
当然,您需要首先确保getChildren.elementAt0存在

用于清理代码 构造DOM解析器 使用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文档。 e、 g

获取根节点中任何位置的所有视图节点,其has和属性名为name,值为viewName


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

dom解析器可以轻松提取,但会出现异常,因为html格式不好。某些结束标记会丢失这些标记,这不是问题,、如果标记也未关闭,dom可以进行分析,,如果没有welformed也没有问题获取数据什么不起作用?你有错误吗?如果没有,发生了什么?
NodeList columns = (NodeList) xpath.evaluate("//view[@name=\"" + viewName + "\"]/column", root, XPathConstants.NODESET);