HTML mit Cyberneko analysieren, um eine Division zu finden
Frage
Ich brauche eine bestimmte 'Div'-tag (id' id ') von einer HTML-Site. Um die Seite zu analysieren, verwende ich Cyberneko.
def doc = new XmlParser( new org.cyberneko.html.parsers.SAXParser() ).parse(htmlFile)
divTag = doc.depthFirst().DIV.find{ it['@id'] == tagId }
Bisher kein Problem, aber am Ende brauche ich kein XML, sondern den ursprünglichen Inhalt des gesamten 'Div' -Tags. Leider kann ich nicht herausfinden, wie das geht ...
Lösung
Bearbeiten: Antwort auf den ersten Kommentar.
Das funktioniert:
def html = """
<body>
<div id="breadcrumbs">
<b>
crumb1
</b>
</div>
</body>
"""
def doc = new XmlSlurper(new org.cyberneko.html.parsers.SAXParser()).parseText(html)
divTag = doc.BODY.DIV.find { it.@id == 'breadcrumbs' }
println "" << new groovy.xml.StreamingMarkupBuilder().bind {xml -> xml.mkp.yield divTag}
Es sieht so aus, als würde Cyberneko ein gut geformtes HTML -Dokument zurückgeben, unabhängig davon, ob das ursprüngliche Markup war. IE, Doc's Root wird ein HTML -Element sein, und es wird auch ein Kopfelement geben. Sauber.
Andere Tipps
Dies ist ein einfacher Test, der auf Noahs Antwort basiert - leider funktioniert er nicht (noch) :(
def html = """
<body>
<div id="breadcrumbs">
<b>
crumb1
</b>
</div>
</body>
"""
def doc = new XmlSlurper( new org.cyberneko.html.parsers.SAXParser() ).parseText(html)
println "document: $doc"
def htmlTag = doc.DIV.find {
println "-> $it"
it['@id'] == "breadcrumbs"
}
println htmlTag
assert htmlTag
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow