XmlSlurper永远不会找到节点

时间:2011-01-24 03:54:11

标签: groovy xmlslurper web-scraping

我正在尝试抓取一些看起来像这样的DOM:

<span>text</span>

有时看起来像这样:

<span><p>text</p></span>

但是,我似乎无法弄清楚如何在第二种情况下获得text。我已经尝试了几种方法,以下是我认为应该在下面工作的方法:

def html = slurper.parse(reader)
Collection<NodeChild> nodes = html.'**'.findAll { it.name() == 'span' && it.@class == 'style2' }
...
def descriptionNode = html.'**'.find { it.name() == 'span' && it.@class == 'style20' }
def innerNode = descriptionNode.'**'.find { it.name() == 'p' }
def description
if (innerNode?.size() > 0)
{
description = innerNode.text()
}
else
{
description = descriptionNode.text()
}

我知道如何使用xmlslurper来获取我需要的行为吗?

3 个答案:

答案 0 :(得分:3)

听起来您想要检查给定的span是否包含嵌套的p。您可以遍历span节点的子节点来检查该情况。例如:

def xml = """
<test>
  <span>test1</span>
  <span><p>test2</p></span>
  <other><span>test3</span></other>
  <other><span><p>test4</p></span></other>
</test>
"""

def doc = new XmlSlurper().parseText(xml)
def descriptions = []
doc.'**'.findAll { it.name() == 'span' }.each { node ->
    if (node.children().find { it.name() == 'p' }) {
            descriptions << node.p.text()
    } else {
            descriptions << node.text()
    }
}
assert descriptions == ['test1', 'test2', 'test3', 'test4']

答案 1 :(得分:0)

你试过xpath://span/text()吗? 您可能需要查询两次以考虑p标记。

答案 2 :(得分:0)

事实证明,HTML必定是无效的。标签创建

<div>
<span>
</span>
<p></p>
</div>

但Firebug显示

<div>
<span>
<p></p>
</span>
</div>

多么可怕的错误。