بدائل لبايثون جميل في لغة جو

استكمالًا لحديثنا عن استخراج البيانات من HTML

Page content
  • لاستخدام نسخة مباشرة من Beautiful Soup في Go، استخدم soup.
  • لدعم محددات CSS، اعتبر goquery.
  • لاستخدام استعلامات XPath، استخدم htmlquery.
  • لخيار آخر مستوحى من Beautiful Soup، راجع Node.

إذا كنت تبحث عن مثيل لـ Beautiful Soup في Go، فإن عدة مكتبات توفر وظائف مماثلة لتحليل ونسخ HTML:

الغُفير يطبخ المرق

soup

  • soup هي مكتبة Go مصممة صراحةً كمثيل لـ Python’s Beautiful Soup. تشبه واجهتها البرمجية بشكل متعمد، وتتميز بوجود وظائف مثل Find، FindAll، وHTMLParse، مما يجعلها سهلة الاستخدام للمطورين المعتادين على Beautiful Soup.
  • تسمح لك بتنزيل صفحات الويب، وتحليل HTML، وتنقل DOM لاستخراج البيانات، تمامًا كما يفعل Beautiful Soup.
  • مثال على الاستخدام:
    resp, err := soup.Get("https://xkcd.com")
    if err != nil {
        os.Exit(1)
    }
    doc := soup.HTMLParse(resp)
    links := doc.Find("div", "id", "comicLinks").FindAll("a")
    for _, link := range links {
        fmt.Println(link.Text(), "| الرابط :", link.Attrs()["href"])
    }
    
  • ملاحظة: soup لا تدعم محددات CSS أو XPath؛ تعتمد على البحث بناءً على العلامات والخصائص.

goquery

  • goquery هي مكتبة شائعة أخرى في Go لتحليل HTML، وتقدم واجهة تشبه jQuery لتنقل وتعديل DOM.
  • تدعم محددات CSS، مما يجعلها أكثر مرونة في الاستعلامات المعقدة مقارنةً بـ soup.
  • مثال على الاستخدام:
    doc, err := goquery.NewDocumentFromReader(resp.Body)
    doc.Find("div#comicLinks a").Each(func(i int, s *goquery.Selection) {
        fmt.Println(s.Text(), "| الرابط :", s.AttrOr("href", ""))
    })
    

مكتبة htmlquery في Go

htmlquery هي مكتبة Go مصممة لتحليل واستخراج البيانات من وثائق HTML باستخدام تعبيرات XPath. توفر واجهة برمجية مباشرة لتنقل واستعلام هيكل شجرة HTML، مما يجعلها مفيدة بشكل خاص للمهام المتعلقة بنسخ الويب واستخراج البيانات.

الميزات الرئيسية

  • تسمح بتحليل وثائق HTML باستخدام تعبيرات XPath 1.0/2.0.
  • تدعم تحميل HTML من السلاسل النصية، الملفات، أو العناوين.
  • توفر وظائف للعثور على عناصر فردية أو متعددة، واستخراج الخصائص، وتقييم تعبيرات XPath.
  • تحتوي على تخزين مؤقت (LRU-based) لتحسين الأداء من خلال تجنب إعادة تجميع تعبيرات XPath بشكل متكرر.
  • مبنية على مكتبات تحليل HTML القياسية في Go، وتعمل مع مكتبات Go الأخرى مثل goquery.

أمثلة على الاستخدام الأساسي

تحميل HTML من سلسلة نصية:

doc, err := htmlquery.Parse(strings.NewReader("..."))

تحميل HTML من عنوان:

doc, err := htmlquery.LoadURL("http://example.com/")

العثور على جميع عناصر <a>:

list := htmlquery.Find(doc, "//a")

العثور على جميع عناصر <a> التي تحتوي على خاصية href:

list := htmlquery.Find(doc, "//a[@href]")

استخراج النص داخل أول عنصر <h1>:

h1 := htmlquery.FindOne(doc, "//h1")
fmt.Println(htmlquery.InnerText(h1)) // يعرض النص داخل العنصر

استخراج جميع القيم الخاصة بخاصة href من عناصر <a>:

list := htmlquery.Find(doc, "//a/@href")
for _, n := range list {
    fmt.Println(htmlquery.SelectAttr(n, "href"))
}

الحالات النموذجية للاستخدام

  • نسخ الويب حيث توفر XPath استعلامات أكثر دقة أو تعقيدًا مقارنةً بمحددات CSS.
  • استخراج البيانات المهيكلة من وثائق HTML.
  • التنقل والتعديل في شجرة HTML بشكل برمجي.

التركيب

go get github.com/antchfx/htmlquery

Node

  • Node هي حزمة Go مستوحاة من Beautiful Soup، وتقدم واجهات برمجية لاستخراج البيانات من وثائق HTML وXML.

Colly

Colly - إطار عمل لنسخ الويب في Go، ويستخدم goquery داخليًا لتحليل HTML.

https://github.com/gocolly/colly

للمثيل - أضف colly إلى ملف go.mod الخاص بك:

module github.com/x/y

go 1.14

require (
        github.com/gocolly/colly/v2 latest
)

مثال:

func main() {
	c := colly.NewCollector()

	// العثور على جميع الروابط والزيارة
	c.OnHTML("a[href]", func(e *colly.HTMLElement) {
		e.Request.Visit(e.Attr("href"))
	})

	c.OnRequest(func(r *colly.Request) {
		fmt.Println("الزيارة", r.URL)
	})

	c.Visit("http://go-colly.org/")
}

جدول المقارنة

المكتبة أسلوب الواجهة البرمجية دعم المحددات الإلهام الملاحظات
soup تشبه Beautiful Soup العلامات والخصائص فقط Beautiful Soup بسيطة، لا دعم لـ CSS/XPath
goquery تشبه jQuery محددات CSS jQuery مرنة، شائعة
htmlquery XPath XPath lxml/XPath استعلامات متقدمة
Node تشبه Beautiful Soup العلامات والخصائص Beautiful Soup تشبه soup

الملخص

  • لاستخدام نسخة مباشرة من Beautiful Soup في Go، استخدم soup.
  • لدعم محددات CSS، اعتبر goquery.
  • لاستخدام استعلامات XPath، استخدم htmlquery.
  • لخيار آخر مستوحى من Beautiful Soup، راجع Node.

كل هذه المكتبات تعتمد على Go’s مُحلّل HTML القياسي، وهو قوي ومت兼容 مع HTML5، إذ تكمن الفروق الرئيسية في أسلوب الواجهة البرمجية وقدرات المحددات.

روابط مفيدة