2012-03-02 74 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給出了匹配節點的內容。