【问题标题】:Extract links from a web page using Go lang使用 Go lang 从网页中提取链接
【发布时间】:2012-06-20 07:26:21
【问题描述】:

我正在学习google's Go programming language。有谁知道从 html 网页中提取所有 URL 的最佳做法?

来自 Java 世界,有一些库可以完成这项工作,例如 jsouphtmlparser 等。但是对于 go lang,我想还没有可用的类似库吗?

【问题讨论】:

    标签: html-parsing go


    【解决方案1】:

    你也可以使用"Colly" (documentations), 它通常用于网络报废

    特点

    1. 清洁 API
    2. 快速(在单核上>1k 请求/秒)
    3. 管理每个域的请求延迟和最大并发
    4. 自动 cookie 和会话处理
    5. 同步/异步/并行抓取
    6. 分布式抓取
    7. 缓存
    8. 非 Unicode 响应的自动编码
    9. Robots.txt 支持
    10. 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
            猜你喜欢
            • 2011-04-14
            • 2019-04-12
            • 2023-03-18
            • 2011-07-04
            • 1970-01-01
            • 1970-01-01
            • 2012-07-06
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多