تحليل HTML في Go (Golang): نظرة عامة على الأدوات والأمثلة
Go (Golang) هي لغة برمجة مترجمة وثابتة الأنواع من Google، وهي مثالية لإنشاء محللات عالية الأداء وأدوات استخراج بيانات الويب. بفضل الدعم المدمج للتوازي (الغوروتينات) والمكتبة القياسية الغنية، تتيح Go معالجة مستندات HTML بأي درجة من التعقيد بكفاءة. في هذه المقالة، سنستعرض المكتبات الرئيسية لتحليل HTML بلغة Go، وإمكانياتها، ونقدم أمثلة عملية على الكود.
المكتبة القياسية: net/html
حزمة golang.org/x/net/html هي الأساس للعمل مع HTML في Go. توفر محللًا ومجزئًا للرموز يقوم ببناء شجرة DOM للمستند. هذه أداة منخفضة المستوى تمنح تحكمًا كاملاً في عملية التحليل، ولكنها تتطلب كودًا أكثر للمهام النمطية.
مثال على استخدام net/html لاستخراج جميع الروابط من مستند HTML:
package main
import ( "fmt" "golang.org/x/net/html" "strings")
func main() { htmlContent := `<html><body><a href="/page1">الرابط 1</a><a href="/page2">الرابط 2</a></body></html>` doc, _ := html.Parse(strings.NewReader(htmlContent)) var links []string 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" { links = append(links, attr.Val) } } } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(doc) for _, link := range links { fmt.Println(link) }}يقوم هذا الكود باجتياز شجرة DOM بشكل متكرر، ويجد جميع الوسوم <a> ويستخرج قيمة السمة href. الطريقة بسيطة وموثوقة، ولكن للمهام الأكثر تعقيدًا (مثل البحث باستخدام محددات CSS)، من الأفضل استخدام مكتبات متخصصة.
مكتبة goquery: jQuery للغة Go
github.com/PuerkitoBio/goquery هي المكتبة الأكثر شيوعًا لتحليل HTML في Go. توفر واجهة برمجة تطبيقات تشبه jQuery: اختيار العناصر باستخدام محددات CSS، وسلاسل الدوال، والتلاعب بـ DOM. هذا يجعل الكود موجزًا وقابلًا للقراءة.
التثبيت:
go get github.com/PuerkitoBio/goqueryمثال على تحليل صفحة مع استخراج العناوين والروابط:
package main
import ( "fmt" "log" "net/http"
"github.com/PuerkitoBio/goquery")
func main() { // تحميل صفحة HTML res, err := http.Get("https://example.com") if err != nil { log.Fatal(err) } defer res.Body.Close()
// تحليل HTML doc, err := goquery.NewDocumentFromReader(res.Body) if err != nil { log.Fatal(err) }
// استخراج عناوين h2 doc.Find("h2").Each(func(i int, s *goquery.Selection) { fmt.Printf("العنوان %d: %s", i+1, s.Text()) })
// استخراج جميع الروابط doc.Find("a").Each(func(i int, s *goquery.Selection) { link, _ := s.Attr("href") text := s.Text() fmt.Printf("الرابط %d: %s (%s)", i+1, text, link) })}الإمكانيات الرئيسية لـ goquery:
- محددات CSS: دعم جميع المحددات القياسية (الفئات، المعرفات، السمات، الفئات الزائفة).
- سلاسل الدوال:
Find().Filter().Each()— كتابة الكود كما في jQuery. - استخراج البيانات: دوال
Text()وHtml()وAttr(). - تعديل DOM:
SetText()وSetHtml()وAppend().
للعمل مع كميات كبيرة من البيانات، goquer