如何在Groovy中过滤网址文本

时间:2014-01-07 14:04:42

标签: parsing url groovy

我想在groovy中过滤网址的内容,但在谷歌中找不到任何指南或用法示例,所以非常感谢任何帮助。

我想做的是获取

中的信息
 <table class="smthng">
以下网址中的

标记

def resultText = "http://weather.am".toURL().text
到目前为止我尝试过的是找到所需的起始行然后处理每一行直到到达结束标记,但我非常确定Groovy应该有一些非常好的处理它。例如,在groovy中,我可以使用find闭包来查找起始标记,例如。

if(it =~ "desired starting tag){
     then keep the value in list
}

但是我不知道如何以优雅的方式为整个表块做这个。我听说过第三部分库,比如dom4j,nekohtml等等,但我确信Groovy本身可以处理这个问题。提前致谢

1 个答案:

答案 0 :(得分:2)

您可以执行此操作(但您需要使用第三方lib才能将HTML解析为XML)

// The 3rd party bit
@Grab( 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' )
import groovy.xml.*

def parser = new org.ccil.cowan.tagsoup.Parser()

// Needed for the serialize method below to avoid html:table prefixed names
parser.setFeature( "http://xml.org/sax/features/namespaces", false )

def tab = new XmlSlurper( parser ).parse( 'http://weather.am' )           // Parse the HTML
                                  .'**'                                   // Search the tree
                                  .findAll { it.name() == 'table' }       // Find tables
                                  .findAll { it.@class == 'pop_up_list' } // With this class
                                  .find()                                 // Just return the first one

// Then print out what we found
println XmlUtil.serialize( tab )

如果您想从此表中获取位置名称(作为示例),您可以执行以下操作:

// For each `tr` in the table, collect the first `td` text
def locations = tab.tr.collect { it.td[ 0 ].text() }
// Print out the items
locations.each { println it }

将打印:

Երևան
Շիրակ
Կոտայք
Գեղարքունիք
Լոռի
Տավուշ
Արագածոտնի լեռներ
Արագածոտնի նախալեռներ
Արարատ
Արմավիր
Վայոց ձորի լեռներ
Վայոց ձորի նախալեռներ
Սյունիքի հովիտներ
Սյունիքի նախալեռն
Արցախ
Ջավախք