我正在编写一个HTML解析器,它使用TagSoup将格式良好的结构传递给XMLSlurper。
以下是通用代码:
def htmlText = """
<html>
<body>
<div id="divId" class="divclass">
<h2>Heading 2</h2>
<ol>
<li><h3><a class="box" href="#href1">href1 link text</a> <span>extra stuff</span></h3><address>Here is the address<span>Telephone number: <strong>telephone</strong></span></address></li>
<li><h3><a class="box" href="#href2">href2 link text</a> <span>extra stuff</span></h3><address>Here is another address<span>Another telephone: <strong>0845 1111111</strong></span></address></li>
</ol>
</div>
</body>
</html>
"""
def html = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser()).parseText( htmlText );
html.'**'.grep { it.@class == 'divclass' }.ol.li.each { linkItem ->
def link = linkItem.h3.a.@href
def address = linkItem.address.text()
println "$link: $address\n"
}我希望每个人都允许我依次选择每一个“li”,这样我就可以检索相应的href和地址细节。相反,我得到了这个输出:
#href1#href2: Here is the addressTelephone number: telephoneHere is another addressAnother telephone: 0845 1111111我检查了web上的各种示例,这些示例要么处理XML,要么是单行示例,如“从该文件检索所有链接”。看起来,it.h3.a.@href表达式正在收集文本中的所有href,即使我将它传递给父节点'li‘节点。
你能告诉我:
的href/address对
谢谢。
发布于 2009-11-05 05:48:18
将grep改为“查找”:
html.'**'.find { it.@class == 'divclass' }.ol.li.each { linkItem ->
def link = linkItem.h3.a.@href
def address = linkItem.address.text()
println "$link: $address\n"
}然后你就会得到
#href1: Here is the addressTelephone number: telephone
#href2: Here is another addressAnother telephone: 0845 1111111grep返回一个ArrayList,但find返回一个NodeChild类:
println html.'**'.grep { it.@class == 'divclass' }.getClass()
println html.'**'.find { it.@class == 'divclass' }.getClass()在以下方面的成果:
class java.util.ArrayList
class groovy.util.slurpersupport.NodeChild因此,如果您想使用grep,那么您可以嵌套另一个这样的,这样它才能工作。
html.'**'.grep { it.@class == 'divclass' }.ol.li.each {
it.each { linkItem ->
def link = linkItem.h3.a.@href
def address = linkItem.address.text()
println "$link: $address\n"
}
}长话短说,在您的情况下,使用查找而不是grep。
https://stackoverflow.com/questions/1675542
复制相似问题