使用Go lang从网页中提取链接

时间:2012-06-18 10:24:35

标签: html-parsing go

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

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

6 个答案:

答案 0 :(得分:23)

如果你了解jQuery,你会爱上GoQuery

老实说,它是我在Go中找到的最简单,最强大的HTML实用程序,它基于go.net存储库中的html包。 (好吧,所以它比仅仅是一个解析器更高级,因为它不会暴露原始的HTML令牌等,但是如果你想要用HTML文档实际完成任何事情,这个包将有所帮助。)

答案 1 :(得分:20)

用于HTML解析的Go标准包仍在进行中,并不属于当前版本。您可以尝试的第三方软件包是go-html-transform。它正在积极维护。

答案 2 :(得分:17)

虽然用于HTML解析的Go包确实仍在进行中,但它可以在go.net存储库中找到。

它的来源位于 code.google.com/p/go.net/html github.com/golang/net,并且正在积极开发。

最近提到go-nuts discussion


请注意,对于Go 1.4(2014年12月),正如我在this answer中提到的那样,该软件包现在是golang.org/x/net(请参阅godoc)。

答案 3 :(得分:6)

我四处搜索,发现有一个名为Gokogiri的库,听起来像是Nogokiri的Ruby。我认为该项目也是active

答案 4 :(得分:0)

我刚刚为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)

要记住的一些事项:

  • 这些是相对链接,而不是完整的网址
  • 不会收集动态生成的链接
  • 没有收集其他链接(META标签,图片,iframe等)。修改此代码以收集这些代码非常容易。

答案 5 :(得分:0)

我写了一个小包来做到这一点,它本质上是一个薄包装 golang.org/x/net/html

package main

import (
   "github.com/89z/mech"
   "net/http"
)

func main() {
   r, err := http.Get("http://speedtest.lax.hivelocity.net")
   if err != nil {
      panic(err)
   }
   defer r.Body.Close()
   doc, err := mech.Parse(r.Body)
   if err != nil {
      panic(err)
   }
   a := doc.ByTag("a")
   for a.Scan() {
      href := a.Attr("href")
      println(href)
   }
}

https://pkg.go.dev/github.com/89z/mech