تحليل HTML في Go: نظرة على المكتبات وأمثلة الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تحليل 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) — البحث عن العناصر باستخدام محدد CSS
  • Each(func) — التكرار على العناصر التي تم العثور عليها
  • Attr(name) — الحصول على قيمة السمة
  • Text() — استخراج المحتوى النصي
  • Html() — الحصول على كود HTML داخل العنصر


goquery مثالية للنمذجة السريعة وتحليل الصفحات ذات البنية المعقدة. لكن تذكر: أنها لا تدعم تنفيذ JavaScript — إنها أداة لـ HTML الثابت.



3. Colly — إطار عمل لتجميع الويب



Colly هو إطار عمل قوي لا يشمل فقط تحليل HTML (عبر goquery)، بل أيضاً إدارة قائمة انتظار الطلبات، والعمل مع الكوكيز، والحدود

توصيات