Анализ HTML с Cyberneko, чтобы найти «дивизионную»
Вопрос
Мне нужен один конкретный «Div» (идентифицированный «id») с HTML-сайта. Чтобы проанализировать страницу, я использую Cyberneko.
def doc = new XmlParser( new org.cyberneko.html.parsers.SAXParser() ).parse(htmlFile)
divTag = doc.depthFirst().DIV.find{ it['@id'] == tagId }
До сих пор нет проблем, но в конце мне не нужен XML, но исходное содержание всего тега «div». К сожалению, я не могу понять, как это сделать ...
Решение
РЕДАКТИРОВАТЬ: Ответ на первый комментарий.
Это работает:
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}
Похоже, что Cyberneko вернет хорошо сформированный HTML -документ, независимо от того, была ли оригинальная разметка. т.е. корень Дока будет элементом HTML, а также будет элемент головы. Аккуратный.
Другие советы
Это простой тест, основанный на ответе Ноя - к сожалению, он (пока) не работает :(
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
Не связан с StackOverflow