تحليل HTML مع Cyberneko للعثور على "div'-tag
سؤال
أحتاج إلى واحد "div'-tag (الذي تم تحديده بواسطة" 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 التي تم تشكيلها جيدًا ، بغض النظر عما إذا كانت العلامات الأصلية كانت. أي ، سيكون جذر DOC عنصر 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