Alternatywy do Beautiful Soup dla Go

Kontynuując temat wyciągania danych z html

Page content
  • Dla bezpośredniego odpowiednika Beautiful Soup w Go użyj soup.
  • Dla obsługi selektorów CSS rozważ goquery.
  • Dla zapytań XPath użyj htmlquery.
  • Dla innego rozwiązania inspirowanego Beautiful Soup, spojrz na Node.

Jeśli szukasz odpowiednika Beautiful Soup w Go, kilka bibliotek oferuje podobną funkcjonalność parsowania i skrapowania HTML:

gopher is cooking soup

soup

  • soup to biblioteka w języku Go zaprojektowana specjalnie jako odpowiednik Pythona’s Beautiful Soup. Jej API jest celowo podobne, oferując funkcje takie jak Find, FindAll i HTMLParse, co ułatwia programistom znanym z Beautiful Soup przejście na język Go.
  • Pozwala pobierać strony sieciowe, parsować HTML i przemieszczać się po DOM w celu wyodrębnienia danych, podobnie jak Beautiful Soup.
  • Przykład użycia:
    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(), "| Link :", link.Attrs()["href"])
    }
    
  • Uwaga: soup nie obsługuje selektorów CSS ani XPath; opiera się na wyszukiwaniu na podstawie tagów i atrybutów.

goquery

  • goquery to kolejna popularna biblioteka w języku Go do parsowania HTML, oferująca składnię podobną do jQuery do przemieszczania się i manipulowania DOM.
  • Obsługuje selektory CSS, co czyni ją bardziej elastyczną do złożonych zapytań w porównaniu do soup.
  • Przykład użycia:
    doc, err := goquery.NewDocumentFromReader(resp.Body)
    doc.Find("div#comicLinks a").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text(), "| Link :", s.AttrOr("href", ""))
    })
    

Biblioteka htmlquery w języku Go

htmlquery to biblioteka w języku Go zaprojektowana do parsowania i wyodrębniania danych z dokumentów HTML przy użyciu wyrażeń XPath. Zapewnia prosty interfejs API do przemieszczania się i wykonywania zapytań na strukturze drzewa HTML, co czyni ją szczególnie przydatną do skrapowania i wyodrębniania danych.

Główne funkcje

  • Pozwala na wykonywanie zapytań do dokumentów HTML za pomocą wyrażeń XPath 1.0/2.0.
  • Obsługuje ładowanie HTML z ciągów, plików lub adresów URL.
  • Udostępnia funkcje do znajdowania pojedynczych lub wielu węzłów, wyodrębniania atrybutów i oceniania wyrażeń XPath.
  • Zawiera pamięć podręczną do zapytań (opartą na LRU), aby poprawić wydajność, unikając ponownego kompilowania wyrażeń XPath.
  • Zbudowana na bazie standardowych bibliotek parsowania HTML w języku Go i kompatybilna z innymi bibliotekami w języku Go, takimi jak goquery.

Przykłady podstawowego użycia

Wczytaj HTML z ciągu:

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

Wczytaj HTML z adresu URL:

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

Znajdź wszystkie elementy ``:

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

Znajdź wszystkie elementy `` z atrybutem href:

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

Wyodrębnij tekst pierwszego elementu ``:

h1 := htmlquery.FindOne(doc, "//h1")
fmt.Println(htmlquery.InnerText(h1)) // Wyświetla tekst wewnątrz 

Wyodrębnij wszystkie wartości atrybutu href z elementów ``:

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

Typowe przypadki użycia

  • Skrapowanie sieciowe, gdzie XPath oferuje bardziej precyzyjne lub złożone zapytania niż selektory CSS.
  • Wyodrębnianie danych strukturalnych z dokumentów HTML.
  • Programowe przemieszczanie się i manipulowanie drzewami HTML.

Instalacja

go get github.com/antchfx/htmlquery

Node

  • Node to pakiet w języku Go inspirowany Beautiful Soup, oferujący interfejsy API do wyodrębniania danych z dokumentów HTML i XML.

Colly

Colly - ramka do skrapowania sieci w języku Go, która wewnętrznie korzysta z goquery do parsowania HTML.

https://github.com/gocolly/colly

Aby zainstalować - dodaj colly do swojego pliku go.mod:

module github.com/x/y

go 1.14

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

Przykład:

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

	// Znajdź i odwiedź wszystkie linki
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		e.Request.Visit(e.Attr("href"))
	})

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

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

Tabela porównania

Biblioteka Styl API Obsługa selektorów Inspiracja Uwagi
soup Podobny do Beautiful Soup Tylko tagi i atrybuty Beautiful Soup Prosty, bez CSS/XPath
goquery Podobny do jQuery Selektory CSS jQuery Elastyczny, popularny
htmlquery XPath XPath lxml/XPath Zaawansowane zapytania
Node Podobny do Beautiful Soup Tylko tagi i atrybuty Beautiful Soup Podobny do soup

Podsumowanie

  • Dla bezpośredniego odpowiednika Beautiful Soup w Go użyj soup.
  • Dla obsługi selektorów CSS rozważ goquery.
  • Dla zapytań XPath użyj htmlquery.
  • Dla innego rozwiązania inspirowanego Beautiful Soup, spojrz na Node.

Wszystkie te biblioteki korzystają z Go’s standardowego parsera HTML, który jest solidny i zgodny z HTML5, więc główną różnicą jest styl API i możliwości selektorów.

Przydatne linki