我需要解析格式错误的HTML页面,并从中提取某些URL作为任何Collection。
我真的不在乎哪种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文档
长约一万五千行,并且有很多我不需要的URL。
因此,我需要每个“内部”块中的第一个URL。

最佳答案

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

您已经编辑了问题,所以class中的findAll位没有任何意义,但是对于当前的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

07-26 05:34