تحليل HTML في Go (Golang): المكتبات وأمثلة الكود

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

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

ابدأ الدورة

تحليل 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

توصيات