XMLSLURRPER / NEKOHTML Фрагмент документа Фрасинг - без тегов HTML или тело

StackOverflow https://stackoverflow.com/questions/3024488

Вопрос

Дорогой все, я пытаюсь разобрать следующий HTML-фрагмент, и я хотел бы получить тот же фрагмент, что и вывод (без тегов HTML и тела). Это возможно? Если так, как?

Спасибо, Миша

PS Я читаю здесь:http://nekohtml.sourceforge.net/faq.html#fragments.И я считаю, что добавил правильные варианты ниже. Однако вывод все еще неверно :(

Спасибо, Миша

import groovy.xml.MarkupBuilder
import groovy.xml.StreamingMarkupBuilder
import groovy.util.XmlNodePrinter
import groovy.util.slurpersupport.NodeChild


def text="""
<div><h2>Test</h2>
<div>Hi</div>
</div>
"""

// Parse
def config=new org.cyberneko.html.HTMLConfiguration()
config.setFeature("http://cyberneko.org/html/features/balance-tags/document-fragment",true)
def html=new XmlSlurper(new org.cyberneko.html.parsers.SAXParser()).parseText(text)          

// Output
def printNode(NodeChild node) {
    def writer = new StringWriter()
    writer << new StreamingMarkupBuilder().bind {
        mkp.declareNamespace('':node[0].namespaceURI())
        mkp.yield node
    }
    new XmlNodePrinter().print(new XmlParser().parseText(writer.toString()))
}
printNode(html)

Выход:

<HTML>
  <tag0:HEAD xmlns:tag0="http://www.w3.org/1999/xhtml"/>
  <BODY>
    <DIV>
      <H2>
        Test
      </H2>
      <DIV>
        Hi
      </DIV>
    </DIV>
  </BODY>
</HTML>
Это было полезно?

Решение

Вызов SetFeature на объекте Parser напрямую, вроде:

@Grab(group='net.sourceforge.nekohtml', module='nekohtml', version='1.9.14')

import groovy.xml.MarkupBuilder
import groovy.xml.StreamingMarkupBuilder
import groovy.util.XmlNodePrinter
import groovy.util.slurpersupport.NodeChild


def text="""
<div><h2>Test</h2>
<div>Hi</div>
</div>
"""

// Parse
def parser=new org.cyberneko.html.parsers.SAXParser()
parser.setFeature("http://cyberneko.org/html/features/balance-tags/document-fragment",true)
def html=new XmlSlurper(parser).parseText(text)          

// Output
def printNode(NodeChild node) {
    def writer = new StringWriter()
    writer << new StreamingMarkupBuilder().bind {
        mkp.declareNamespace('':node[0].namespaceURI())
        mkp.yield node
    }
    new XmlNodePrinter().print(new XmlParser().parseText(writer.toString()))
}
printNode(html)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top