使用 Go lang 从网页中提取链接
Posted
技术标签:
【中文标题】使用 Go lang 从网页中提取链接【英文标题】:Extract links from a web page using Go lang 【发布时间】:2012-06-20 07:26:21 【问题描述】:我正在学习google's Go programming language。有谁知道从 html 网页中提取所有 URL 的最佳做法?
来自 Java 世界,有一些库可以完成这项工作,例如 jsoup 、htmlparser 等。但是对于 go lang,我想还没有可用的类似库吗?
【问题讨论】:
【参考方案1】:你也可以使用"Colly" (documentations), 它通常用于网络报废
特点
-
清洁 API
快速(在单核上>1k 请求/秒)
管理每个域的请求延迟和最大并发
自动 cookie 和会话处理
同步/异步/并行抓取
分布式抓取
缓存
非 Unicode 响应的自动编码
Robots.txt 支持
Google App Engine 支持
import (
"fmt"
"github.com/gocolly/colly"
)
func main()
c := colly.NewCollector()
// Find and visit all links
c.OnHTML("a", func(e *colly.HTMLElement)
e.Request.Visit(e.Attr("href"))
)
c.OnRequest(func(r *colly.Request)
fmt.Println("Visiting", r.URL)
)
c.Visit("http://go-colly.org/")
【讨论】:
【参考方案2】:我刚刚为 Go 发布了一个基于事件的开源 HTML 5.0 兼容解析包。你可以find it here
以下是从页面(来自 A 元素)获取所有链接的示例代码:
links := make([]string)
parser := NewParser(htmlContent)
parser.Parse(nil, func(e *HtmlElement, isEmpty bool)
if e.TagName == "link"
link,_ := e.GetAttributeValue("href")
if(link != "")
links = appends(links, link)
, nil)
需要注意的几点:
这些是相对链接,不是完整的 URL 不会收集动态生成的链接 还有其他链接未被收集(META 标签、图像、iframe 等)。修改此代码以收集这些代码非常容易。【讨论】:
【参考方案3】:虽然用于 HTML 解析的 Go 包确实仍在开发中,但它可以在 go.net 存储库中找到。
它的来源是 code.google.com/p/go.net/html
github.com/golang/net
,它正在积极开发中。
最近的go-nuts discussion中提到了。
请注意,正如我在 this answer 中提到的那样,使用 Go 1.4(2014 年 12 月),包现在是 golang.org/x/net
(请参阅 godoc)。
【讨论】:
Go html 包已移至 go.net 存储库。 Here 是文档。 @ctn 感谢您的更新。不确定您的编辑为什么被拒绝:我已在答案中恢复它。 谢谢。他们说这会改变原意太多,我最好留下评论。【参考方案4】:如果你了解 jQuery,你会喜欢GoQuery。
老实说,它是我在 Go 中找到的最简单、最强大的 HTML 实用程序,它基于 go.net 存储库中的 html 包。 (好吧,所以它比解析器更高级,因为它不暴露原始 HTML 令牌等,但如果你想用 HTML 文档实际完成任何事情,这个包会有所帮助。)
【讨论】:
【参考方案5】:我四处搜索,发现有一个名为Gokogiri 的库,听起来像Ruby 的Nogokiri。我认为该项目也是active。
【讨论】:
【参考方案6】:Go 的 HTML 解析标准包仍在开发中,不是当前版本的一部分。您可能会尝试的第三方软件包是go-html-transform。它正在积极维护中。
【讨论】:
我在任何地方都找不到有关如何使用此库进行抓取的示例,并且从文档中也看不到。谁能给我举个例子? 计划在 Go 中原生包含这个包吗? HTML 包现在可用。在此处阅读文档:godoc.org/golang.org/x/net/html以上是关于使用 Go lang 从网页中提取链接的主要内容,如果未能解决你的问题,请参考以下文章