0

私は次のようないくつかのDOMをページスクレイプしようとしています:

<span>text</span>

そして時々このように見えます:

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

textしかし、私は2番目のシナリオに入る方法を理解できないようです。私はいくつかの方法を試しました、そしてこれが私が以下でうまくいくと思ったものです:

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を使用する必要がある方法はありますか?

4

3 に答える 3

3

span与えられたものにネストされたが含まれているかどうかを確認したいようですpspanノードの子を反復処理して、そのケースを確認できます。例:

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']
于 2011-01-24T06:35:15.297 に答える
0

結局のところ、HTMLは無効であったに違いありません。作成されたTagsoup

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

しかし、Firebugが表示されました

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

なんてひどいバグでしょう。

于 2011-01-25T02:25:20.097 に答える
0

xpathを試しましたか://span/text()?タグ付けされたpを説明するために、2回クエリする必要がある場合があります。

于 2011-01-24T06:08:28.673 に答える