Go (Golang) में HTML पार्सिंग: उपकरण और व्यावहारिक उदाहरण
Go (Golang) एक कम्पाइल्ड, स्टैटिकली टाइप की गई भाषा है, जिसे Google में बनाया गया है। उच्च प्रदर्शन, समवर्तीता के लिए अंतर्निहित समर्थन और समृद्ध मानक लाइब्रेरी के कारण, Go वेब स्क्रैपिंग और HTML पार्सिंग के लिए सबसे अच्छी भाषाओं में से एक बन गया है। इस लेख में, हम Go में HTML दस्तावेज़ों के साथ काम करने के लिए मुख्य लाइब्रेरीज़ पर चर्चा करेंगे, कोड उदाहरण देंगे और उनकी क्षमताओं की तुलना करेंगे।
Go में HTML क्यों पार्स करें?
वेब पेजों से डेटा निकालने के लिए HTML पार्सिंग आवश्यक है: समाचार, मूल्य, संपर्क जानकारी, खोज परिणाम। Go इस कार्य के लिए एकदम सही है क्योंकि:
- उच्च गति निष्पादन (मशीन कोड में कम्पाइल होता है)
- नेटवर्क के साथ आसान काम (अंतर्निहित पैकेज
net/http) - विशेष लाइब्रेरीज़ के माध्यम से DOM ट्री को पार्स करने में सरलता
- मल्टीथ्रेडिंग के लिए उत्कृष्ट समर्थन (गोरूटीन और चैनल)
Go में HTML पार्सिंग के लिए मुख्य लाइब्रेरीज़
1. net/html — मानक लाइब्रेरी
golang.org/x/net/html — यह Go की मानक लाइब्रेरी से एक निम्न-स्तरीय टोकनाइज़र और HTML पार्सर है। यह पार्सिंग प्रक्रिया पर पूर्ण नियंत्रण प्रदान करता है, लेकिन अधिक कोड लिखने की आवश्यकता होती है।
उदाहरण: HTML दस्तावेज़ से सभी लिंक (<a href>) निकालना।
package main
import ( "fmt" "golang.org/x/net/html" "net/http" "log")
func main() { resp, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer resp.Body.Close()
doc, err := html.Parse(resp.Body) if err != nil { log.Fatal(err) }
var f func(*html.Node) f = func(n *html.Node) { if n.Type == html.ElementNode && n.Data == "a" { for _, attr := range n.Attr { if attr.Key == "href" { fmt.Println(attr.Val) } } } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(doc)}लाभ: तृतीय-पक्ष पैकेज स्थापित करने की आवश्यकता नहीं, पूर्ण नियंत्रण। नुकसान: बहुत अधिक बॉयलरप्लेट कोड, जटिल सेलेक्टर्स के लिए असुविधाजनक।
2. goquery — jQuery-जैसा सिंटैक्स
github.com/PuerkitoBio/goquery — Go में HTML पार्सिंग के लिए सबसे लोकप्रिय लाइब्रेरी। यह jQuery के समान API प्रदान करता है: Find(), Each(), Attr(), Text()।
उदाहरण: वेबसाइट से समाचार शीर्षक पार्स करना।
package main
import ( "fmt" "github.com/PuerkitoBio/goquery" "log" "net/http")
func main() { resp, err := http.Get("https://habr.com/ru/news/") if err != nil { log.Fatal(err) } defer resp.Body.Close()
doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { log.Fatal(err) }
doc.Find("h2.tm-article-snippet__title").Each(func(i int, s *goquery.Selection) { title := s.Find("a").Text() link, _ := s.Find("a").Attr("href") fmt.Printf("%d. %s लिंक: %s", i+1, title, link) })}लाभ: सरल सिंटैक्स, CSS सेलेक्टर्स के लिए समर्थन, समृद्ध दस्तावेज़ीकरण। नुकसान: बहुत बड़े दस्तावेज़ों के लिए उपयुक्त नहीं (सब कुछ मेमोरी में लोड करता है)।
3. colly — वेब स्क्रैपिंग फ्रेमवर्क
github.com/gocolly/colly — यह डेटा संग्रह के लिए एक शक्तिशाली फ्रेमवर्क है। इसमें HTML पार्सिंग (goquery पर आधारित), अनुरोध कतार प्रबंधन, कुकीज़ प्रोसेसिंग, गति सीमाएँ और बहुत कुछ शामिल है।
उदाहरण: अनुरोधों के बीच देरी के साथ वेबसाइट के पहले पेज से सभी लिंक एकत्र करना।
package main
import ( "fmt" "github.com/gocolly/colly/v2")
func main() { c := colly.NewC