بدائل لبايثون جميل في لغة جو
استكمالًا لحديثنا عن استخراج البيانات من HTML
- لاستخدام نسخة مباشرة من 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، إذ تكمن الفروق الرئيسية في أسلوب الواجهة البرمجية وقدرات المحددات.