Extraiga HTML de comentario a una etiqueta de cierre usando jsoup java

Tengo algo de HTML que parece

 

Blah...

blah

Necesito extraer el HTML del comentario a una etiqueta dl de cierre. El dl de cierre es el primero después del comentario (no estoy seguro si podría haber más después, pero nunca lo hay antes). El HTML entre los dos es variable en longitud y contenido y no tiene ningún buen identificador.

Veo que los comentarios en sí pueden seleccionarse utilizando # nodos de comentario, pero ¿cómo puedo obtener el HTML a partir de un comentario y terminando con una etiqueta de cierre HTML como he descrito?

Esto es lo que he encontrado, que funciona, pero obviamente no es el más eficiente.

  String myDirectoryPath = "D:\\Path"; File dir = new File(myDirectoryPath); Document myDoc; Pattern p = Pattern.compile("([\\S\\s]*?)"); for (File child : dir.listFiles()) { System.out.println(child.getAbsolutePath()); File file = new File(child.getAbsolutePath()); String charSet = "UTF-8"; String innerHtml = Jsoup.parse(file,charSet).select("body").html(); Matcher m = p.matcher(innerHtml); if (m.find()) { Document doc = Jsoup.parse(m.group(1)); String myText = doc.text(); try { PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("D:\\Path\\combined.txt", true))); out.println(myText); out.close(); } catch (IOException e) { //error } } } 

Para usar una expresión regular, tal vez algo simple

  # "([\\S\\s]*?)"  ([\S\s]*?)  

Aquí hay un código de ejemplo: puede necesitar mejoras adicionales, dependiendo de lo que quieras hacer.

 final String html = "

abc

" // Additional tag before the comment + "\n" + "

Blah...

\n" + "
blah
" + "

def

"; // Additional tag after the comment // Since it's not a full Html document (header / body), you may use a XmlParser Document doc = Jsoup.parse(html, "", Parser.xmlParser()); for( Node node : doc.childNodes() ) // Iterate over all elements in the document { if( node.nodeName().equals("#comment") ) // if it's a comment we do something { // Some output for testing ... System.out.println("=== Comment ======="); System.out.println(node.toString().trim()); // 'toString().trim()' is only out beautify System.out.println("=== Childs ========"); // Get the childs of the comment --> following nodes final List childNodes = node.siblingNodes(); // Start- and endindex for the sublist - this is used to skip tags before the actual comment node final int startIdx = node.siblingIndex(); // Start index - start after (!) the comment node final int endIdx = childNodes.size(); // End index - the last following node // Iterate over all nodes, following after the comment for( Node child : childNodes.subList(startIdx, endIdx) ) { /* * Do whatever you have to do with the nodes here ... * In this example, they are only used as Element's (Html Tags) */ if( child instanceof Element ) { Element element = (Element) child; /* * Do something with your elements / nodes here ... * * You can skip eg 'p'-tag by checking tagnames. */ System.out.println(element); // Stop after processing 'dl'-tag (= closing 'dl'-tag) if( element.tagName().equals("dl") ) { System.out.println("=== END ==========="); break; } } } } }

Para una mejor comprensión, el código es muy detallado, puede acortarlo en algunos puntos.

Y finalmente, aquí está la salida de este ejemplo:

 === Comment =======  === Childs ======== 

Blah...

blah
=== END ===========

Por cierto para obtener el texto del comentario, simplemente cámbielo al Comment :

 String commentText = ((Comment) node).getData();