تحليل HTML في Go (Golang): نظرة على المكتبات وأمثلة عملية
Go (Golang) هي لغة مترجمة وثابتة النوع، وهي مثالية لبناء أدوات عالية الأداء لتجميع الويب وتحليل HTML. توفر المكتبة القياسية المدمجة net/html محللاً منخفض المستوى، ولكن للعمل المريح مع شجرة DOM ومحددات CSS، غالباً ما تُستخدم الحزم الخارجية. في هذه المقالة، سنستعرض ثلاث أدوات رئيسية: goquery وcolly والحزمة القياسية net/html. ستتعلم كيفية اختيار الأداة المناسبة، وسترى أمثلة عملية للكود.
1. المكتبة القياسية: net/html
توفر الحزمة golang.org/x/net/html محللاً ومجزئاً لـ HTML. وهي تنفذ مواصفات HTML5 وتسمح بتحليل المستند إلى شجرة من العقد. هذا هو الخيار الأخف والأسرع، ولكنه يتطلب كتابة كود أكثر للتنقل.
مثال: استخراج جميع الروابط (<a href>) من الصفحة:
package main
import ( "fmt" "golang.org/x/net/html" "net/http" "strings")
func main() { resp, _ := http.Get("https://example.com") defer resp.Body.Close()
doc, _ := html.Parse(resp.Body)
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)
fmt.Println(strings.Join(links, ""))}الإيجابيات: تبعيات قليلة، سرعة عالية.
السلبيات: لا توجد محددات CSS، تحتاج إلى كتابة متتبعات تكرارية.
2. goquery — jQuery للغة Go
goquery هي المكتبة الأكثر شعبية لتحليل HTML في Go. تستخدم net/html في الخلفية وتضيف بناء جملة مشابهاً لـ jQuery. يمكنك استخدام محددات CSS للبحث عن العناصر، وسلاسل الاستدعاءات، والتلاعب بـ DOM.
التثبيت:
go get github.com/PuerkitoBio/goqueryمثال: جمع عناوين المقالات من مدونة:
package main
import ( "fmt" "github.com/PuerkitoBio/goquery" "log" "net/http")
func main() { resp, err := http.Get("https://habr.com/ru/all/") if err != nil { log.Fatal(err) } defer resp.Body.Close()
doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { log.Fatal(err) }
doc.Find("article h2").Each(func(i int, s *goquery.Selection) { title := s.Text() link, _ := s.Find("a").Attr("href") fmt.Printf("%d. %s %s", i+1, title, link) })}الطرق الأساسية في goquery:
Find(selector)— البحث عن العناصر باستخدام محدد CSSEach(func)— التكرار على العناصر التي تم العثور عليهاAttr(name)— الحصول على قيمة السمةText()— استخراج المحتوى النصيHtml()— الحصول على كود HTML داخل العنصر
goquery مثالية للنمذجة السريعة وتحليل الصفحات ذات البنية المعقدة. لكن تذكر: أنها لا تدعم تنفيذ JavaScript — إنها أداة لـ HTML الثابت.
3. Colly — إطار عمل لتجميع الويب
Colly هو إطار عمل قوي لا يشمل فقط تحليل HTML (عبر goquery)، بل أيضاً إدارة قائمة انتظار الطلبات، والعمل مع الكوكيز، والحدود