我想在 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 的答案。又名。最简单的方法!
假设 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()}"
}
一个快速的谷歌搜索出现了一个漂亮的可能性,TagSoup。
我不知道 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
使用 XMLSlurper 将 HTML 解析为 XML 文档,然后使用带有适当闭包的 find 方法选择 a 标签,然后使用 GPathResult 上的 list 方法获取标签列表。然后,您应该能够将文本提取为 GPathResult 的子项。
尝试正则表达式。像这样的东西应该工作:
(html =~ /<a.*href='(.*?)'.*>(.*?)<\/a>/).each { url, text ->
// do something with url and text
}
看看Groovy - Tutorial 4 - Regular expressions basics和Anchor Tag Regular Expression Breaking。
仅当 HTMl 格式正确时,使用 XMlSlurper 进行解析才有效。
如果您的 HTMl 页面包含格式不正确的标签,请使用正则表达式来解析页面。
前任:<a href="www.google.com">
在这里,“a”不是封闭的,因此格式不正确。
new URL(url).eachLine{
(it =~ /.*<A HREF="(.*?)">/).each{
// process hrefs
}
}
Html 解析器 + 正则表达式 任何语言都可以,尽管我认为 Perl 是最快的解决方案。