我正在尝试抓取一些看起来像这样的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来获取我需要的行为吗?
答案 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>
多么可怕的错误。