Alternativ till Beautiful Soup för Go

Fortsätter ämnet om att extrahera data från HTML

Sidinnehåll
  • För en direkt motsvarighet till Beautiful Soup i Go, använd soup.
  • För stöd för CSS-selektorer, överväg goquery.
  • För XPath-förfrågningar, använd htmlquery.
  • För ett annat alternativ inspirerat av Beautiful Soup, titta på Node.

Om du letar efter en motsvarighet till Beautiful Soup i Go, erbjuder flera bibliotek liknande HTML-parsing och skrapningsfunktioner:

gopher lagar soppa

soup

  • soup är ett Go-bibliotek som explicit är utformat som en motsvarighet till Pythons Beautiful Soup. Dess API är avsiktligt liknande, med funktioner som Find, FindAll och HTMLParse, vilket gör det enkelt för utvecklare som är bekanta med Beautiful Soup att övergå till Go.
  • Det låter dig hämta webbsidor, parsa HTML och navigera i DOM för att extrahera data, precis som Beautiful Soup.
  • Exempel på användning:
    resp, err := soup.Get("https://xkcd.com")
    if err != nil {
        os.Exit(1)
    }
    doc := soup.HTMLParse(resp)
    links := doc.Find("div", "id", "comicLinks").FindAll("a")
    for _, link := range links {
        fmt.Println(link.Text(), "| Länk:", link.Attrs()["href"])
    }
    
  • Observera: soup stöder inte CSS-selektorer eller XPath; det förlitar sig på sökning baserad på taggar och attribut.

goquery

  • goquery är ett annat populärt Go-bibliotek för HTML-parsing, som erbjuder en jQuery-liknande syntax för DOM-navigering och manipulation.
  • Det stöder CSS-selektorer, vilket gör det mer flexibelt för komplexa förfrågningar jämfört med soup.
  • Exempel på användning:
    doc, err := goquery.NewDocumentFromReader(resp.Body)
    doc.Find("div#comicLinks a").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text(), "| Länk:", s.AttrOr("href", ""))
    })
    

htmlquery Go-bibliotek

htmlquery är ett Go-bibliotek som är utformat för att parsa och extrahera data från HTML-dokument med hjälp av XPath-uttryck. Det erbjuder ett enkelt API för att navigera och förfråga HTML-trädstrukturen, vilket gör det särskilt användbart för webbskrapning och datainhämtning.

Nyckelfunktioner

  • Tillåter förfrågningar av HTML-dokument med XPath 1.0/2.0-uttryck.
  • Stöder laddning av HTML från strängar, filer eller URL:er.
  • Erbjuder funktioner för att hitta enskilda eller flera noder, extrahera attribut och utvärdera XPath-uttryck.
  • Inkluderar förfrågningscachning (LRU-baserad) för att förbättra prestanda genom att undvika upprepad kompilering av XPath-uttryck.
  • Byggt på Go:s standardbibliotek för HTML-parsing och är kompatibelt med andra Go-bibliotek som goquery.

Grundläggande användningsexempel

Ladda HTML från en sträng:

doc, err := htmlquery.Parse(strings.NewReader("..."))

Ladda HTML från en URL:

doc, err := htmlquery.LoadURL("http://example.com/")

Hitta alla ``-element:

list := htmlquery.Find(doc, "//a")

Hitta alla ``-element med ett href-attribut:

list := htmlquery.Find(doc, "//a[@href]")

Extrahera texten från det första ``-elementet:

h1 := htmlquery.FindOne(doc, "//h1")
fmt.Println(htmlquery.InnerText(h1)) // Skriver ut texten inom

Extrahera alla värden av href-attributet från ``-element:

list := htmlquery.Find(doc, "//a/@href")
for _, n := range list {
    fmt.Println(htmlquery.SelectAttr(n, "href"))
}

Typiska användningsområden

  • Webbskrapning där XPath erbjuder mer exakt eller komplex förfrågan än CSS-selektorer.
  • Extrahering av strukturerad data från HTML-dokument.
  • Navigering och manipulation av HTML-träd programmatiskt.

Installation

go get github.com/antchfx/htmlquery

Node

  • Node är ett Go-paket inspirerat av Beautiful Soup, som erbjuder API:er för att extrahera data från HTML- och XML-dokument.

Colly

Colly - Ett webbskrapningsramverk för Go, som använder goquery internt för HTML-parsing.

https://github.com/gocolly/colly

För att installera - lägg till colly i din go.mod-fil:

module github.com/x/y

go 1.14

require (
        github.com/gocolly/colly/v2 latest
)

Exempel:

func main() {
	c := colly.NewCollector()

	// Hitta och besök alla länkar
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		e.Request.Visit(e.Attr("href"))
	})

	c.OnRequest(func(r *colly.Request) {
		fmt.Println("Besöker", r.URL)
	})

	c.Visit("http://go-colly.org/")
}

Jämförelsetabell

Bibliotek API-stil Selektorstöd Inspiration Anteckningar
soup Liknande Beautiful Soup Endast taggar och attribut Beautiful Soup Enkelt, ingen CSS/XPath
goquery Liknande jQuery CSS-selektorer jQuery Flexibelt, populärt
htmlquery XPath XPath lxml/XPath Avancerade förfrågningar
Node Liknande Beautiful Soup Endast taggar och attribut Beautiful Soup Liknande soup

Sammanfattning

  • För en direkt motsvarighet till Beautiful Soup i Go, använd soup.
  • För stöd för CSS-selektorer, överväg goquery.
  • För XPath-förfrågningar, använd htmlquery.
  • För ett annat alternativ inspirerat av Beautiful Soup, titta på Node.

Alla dessa bibliotek utnyttjar Go’s standard HTML-parser, som är robust och HTML5-kompatibel, så den huvudsakliga skillnaden ligger i API-stil och selektorfunktioner.

Användbara länkar