2012-03-02 131 views
0

我想提取一个html文件的文本内容生成一些工具。 因为html格式不正确,我无法使用普通的sax或dom解析器。解析html报告文件

所以我试图用HTMLParser的http://htmlparser.sourceforge.net/

现在,我怎么能提取我所需要的节点?

我使用了下面的代码,但它没有读取节点文本内容。它只是打印tds与它的attibute.How我可以获取节点的身体?

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()); 
}  
+0

DOM解析器可以方便地提取 – 2012-03-02 15:07:34

+0

它给了异常,因为HTML不是很好formeed.Some关闭标签缺失 – user93796 2012-03-02 15:10:23

+0

那不是一个问题,, DOM可以解析,如果标签是不是也收,,如果不还welformed没有问题的取数据 – 2012-03-02 17:21:52

回答

0

如果是HTML,像Jsoup的HTML解析库可以处理HTML和它的所有可能的污秽。

0

如果你读了该库JavaDoc中,你会看到的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)存在第一...

+0

不起作用。试过 – user93796 2012-03-02 15:22:48

+0

什么不起作用?你有错误吗?如果没有,发生了什么? – 2012-03-02 16:26:34

0
  1. 使用Html cleaner清理你的代码
  2. 构建DOM解析器
  3. 使用XPath提取您想
  4. 数据

示例代码清理您的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 doc可以找到here。 如

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

得到所有的view节点,存在于根节点的任何地方,其拥有和属性,叫做name与价值viewName

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