如何解析网页并提取所有href链接?

15
我希望在Groovy中解析一个网页,并提取所有的 href 链接以及与之相关的文本。
如果页面包含这些链接:
<a href="http://www.google.com">Google</a><br />
<a href="http://www.apple.com">Apple</a>

输出将会是:

Google, http://www.google.com<br />
Apple, http://www.apple.com

我正在寻找一个Groovy答案。也就是说,简单的方法!

7个回答

17

假设XHTML格式正确,读取xml文件,收集所有标签,查找'a'标签,然后打印出href和文本。

input = """<html><body>
<a href = "http://www.hjsoft.com/">John</a>
<a href = "http://www.google.com/">Google</a>
<a href = "http://www.stackoverflow.com/">StackOverflow</a>
</body></html>"""

doc = new XmlSlurper().parseText(input)
doc.depthFirst().collect { it }.findAll { it.name() == "a" }.each {
    println "${it.text()}, ${it.@href.text()}"
}

1
这种方法不太可行的原因很简单但却是真实的 - 通常网站没有格式良好的XML。它在某些情况下可能有效,但并非全部情况都适用。 - MeIr
1
这是一个不错的链接:http://blog.stannard.net.au/2010/05/12/parsing-html-with-groovy-and-htmlcleaner/ - MeIr

4
一个快速的谷歌搜索给出了一个看起来不错的选择,TagSoup

这个网站提供了一个完整的使用TagSoup的示例。http://www.cyblex.at/blog/?p=83我不得不更改一些引号('和")才能使其运行,但这个示例非常好。作者下载了所有*.mp4文件。 - anon

2
我不懂Java,但我认为XPath比经典正则表达式更好,因为它可以获取一个或多个HTML元素。而且,它也更容易编写和阅读。
<html>
   <body>
      <a href="1.html">1</a>
      <a href="2.html">2</a>
      <a href="3.html">3</a>
   </body>
</html>

使用上述HTML,表达式"/html/body/a"将列出所有href元素。
这是一个逐步教程的好例子:http://www.zvon.org/xxl/XPathTutorial/General/examples.html

1
使用XMLSlurper将HTML解析为XML文档,然后使用适当的闭包使用find方法选择a标签,接着在GPathResult上使用list方法获取标签列表。然后,您应该能够从GPathResult的子项中提取文本。

0

使用XMLSlurper解析只适用于HTML格式正确的页面。

如果您的HTML页面有非格式正确的标签,则使用正则表达式来解析页面。

例如:<a href="www.google.com">

在这里,“a”没有关闭,因此不是格式正确的。

 new URL(url).eachLine{
   (it =~ /.*<A HREF="(.*?)">/).each{
       // process hrefs
   }
}

0

4
正则表达式也能治愈癌症。 - wfarr
以可能导致恶魔附身为代价 http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html - harschware

-2

HTML解析器+正则表达式 任何语言都可以,但我会说Perl是最快的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接