【问题标题】:Groovy XmlSlurper get value of the node without childrenGroovy XmlSlurper 获取没有子节点的节点的值
【发布时间】:2015-06-20 03:52:18
【问题描述】:

我正在解析 HTML 并尝试获取父节点本身的值,而没有子节点的值。

HTML 示例:

<html>
    <body>
        <div>
             <a href="http://intro.com">extra stuff</a>
             Text I would like to get.
             <a href="http://example.com">link to example</a>
        </div>
    </body>
</html>

代码:

def tagsoupParser = new org.ccil.cowan.tagsoup.Parser()
def slurper = new XmlSlurper(tagsoupParser)
def htmlParsed = slurper.parseText(stringToParse)

println htmlParsed.body.div[0]

但是上面的代码返回:

额外的东西我想得到的文本。示例链接

如何只获取父节点值而没有子节点?示例:

我想得到的文字。

附注: 我尝试通过执行 substring 来删除额外的元素,但它被证明是不可靠的。

【问题讨论】:

    标签: groovy html-parsing nodes xmlslurper


    【解决方案1】:

    无需切换到XmlParser,只需将第一个div转换为NodeChild即可:

    def html = new XmlSlurper().parseText(xml)
    def text = (html.body.div.first() as NodeChild).localText().first()
    
    // Using @CompileStatic:
    GPathResult html = new XmlSlurper().parseText(xml)
    GPathResult div = html["body"]["div"]
    String text = (div.first() as NodeChild).localText().first()
    

    【讨论】:

      【解决方案2】:

      如果你改用XmlParser而不是XmlSlurper,你可以这样做:

      println htmlParsed.body.div[0].localText()[0]
      

      假设你是on Groovy 2.3+

      【讨论】:

      • 试过了,这里有一个例外:没有方法签名:groovy.util.slurpersupport.NodeChildren.localText()
      • 很公平......以为它只是 Parser :-)
      • 我希望我可以切换到 Parser,但一切都是使用 Slurper 编写的。
      • @Melr 看起来像 Groovy 版本,而不是 Parser/Slurper 问题...您使用的是哪个版本的 Groovy?
      • @MeIr 我认为您可以使用这种解决方法:htmlParsed.body.div[0].nodeIterator().collect().find().@children.findAll { it instanceof String }.join() 如果您无法升级版本...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      相关资源
      最近更新 更多