2012-03-02 5 views
0

Я пытаюсь извлечь текстовое содержимое html-файла, сгенерированного с помощью некоторого инструмента. Я не могу использовать обычный саксофон или синтаксический анализатор, потому что html неправильно сформирован.parsing html report file

Так я попытался с помощью 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

Домашний анализатор может легко извлечь –

+0

Он дает исключение, поскольку html не является корректным. Некоторые закрывающие теги отсутствуют – user93796

+0

Это не проблема, dom может анализировать, если теги не закрыты также, если не приветствуются, также нет проблем с выбором данные –

ответ

0

Если это HTML, HTML-разборе библиотеки, как Jsoup может иметь дело с HTML, и все это, вероятно, злобность.

0

Если вы читали 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) существует первый ...

.
+0

не работает. Просто попробовал – user93796

+0

Что не работает? Вы получили сообщение об ошибке? Если нет, что случилось? –

0
  1. Используйте Html cleaner, чтобы очистить свой код
  2. Construct 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 дает содержание узла согласования ,