从groovy中的href标签中提取URL



我需要解析一个格式错误的html页面,并从中提取某些url作为任何类型的集合。我并不关心是什么类型的Collection,我只需要能够遍历它。

假设我们有一个这样的结构:

<html>
  <body>
    <div class="outer">
      <div class="inner">
        <a href="http://www.google.com" title="Google">Google-Link</a>
        <a href="http://www.useless.com" title="I don't need this">Blah blah</a>
      </div>
      <div class="inner">
        <a href="http://www.youtube.com" title="Youtube">Youtube-Link</a>
        <a href="http://www.useless2.com" title="I don't need this2">Blah blah2</a>
      </div>
    </div>
  </body>
</html>

到目前为止我做的是:

// tagsoup version 1.2 is under apache license 2.0
@Grab(group='org.ccil.cowan.tagsoup', module='tagsoup', version='1.2' )
XmlSlurper slurper = new XmlSlurper(new org.ccil.cowan.tagsoup.Parser());
GPathResult nodes = slurper.parse("test.html"); 
def links = nodes."**".findAll { it.@class == "inner" }
println links

我想要像

这样的东西
["http://google.com", "http://youtube.com"]

但我得到的是:

["Google-LinkBlah blah", "Youtube-LinkBlah blah2"]
更准确地说,我不能使用所有的url,因为我需要解析html文档大约有15000行长,有很多我不需要的url。所以我需要第一个 URL在每个"inner"div块。

正如The Trav所说,您需要从每个匹配的a标记中获取href属性。

您已经编辑了您的问题,因此findAll中的class位没有意义,但对于当前的HTML示例,这应该起作用:

def links = nodes.'**'.findAll { it.name() == 'a' }*.@href*.text()

编辑

如果(正如你在编辑后所说的)你只想要第一个a在任何标记为class="inner"的东西里面,然后尝试:

def links = nodes.'**'.findAll { it.@class?.text() == 'inner' }
                 .collect { d -> d.'**'.find { it.name() == 'a' }?.@href }
                 .findAll() // remove nulls if there are any

您正在寻找每个节点上的@href

相关内容

  • 没有找到相关文章

最新更新