Go:
פיענוח HTML
איך לעשות:
כדי לנתח HTML ב-Go, בדרך כלל משתמשים בחבילת goquery
או בחבילת net/html
של הספרייה הסטנדרטית. הנה דוגמא בסיסית בה משתמשים ב-net/html
כדי לחלץ את כל הקישורים מדף אינטרנט:
package main
import (
"fmt"
"golang.org/x/net/html"
"net/http"
)
func main() {
// קבלת מסמך HTML
res, err := http.Get("http://example.com")
if err != nil {
panic(err)
}
defer res.Body.Close()
// ניתוח המסמך HTML
doc, err := html.Parse(res.Body)
if err != nil {
panic(err)
}
// פונקציה לטיול רקורסיבי ב-DOM
var f func(*html.Node)
f = func(n *html.Node) {
if n.Type == html.ElementNode && n.Data == "a" {
for _, a := range n.Attr {
if a.Key == "href" {
fmt.Println(a.Val)
break
}
}
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
f(c)
}
}
// טיול ב-DOM
f(doc)
}
פלט לדוגמא (בהנחה ש-http://example.com
מכיל שני קישורים):
http://www.iana.org/domains/example
http://www.iana.org/domains/reserved
הקוד הזה מבקש דף HTML, מנתח אותו, וטייל באופן רקורסיבי ב-DOM כדי למצוא ולהדפיס את תכונות ה-href
של כל תגיות ה-<a>
.
היכנסות לעומק
חבילת net/html
מספקת את היסודות לניתוח HTML ב-Go, על ידי מימוש ישיר של אלגוריתמי הטוקניזציה ובניית העץ המפורטים על ידי התקן HTML5. גישה זו ברמה נמוכה היא חזקה אך עשויה להיות מילולית למשימות מורכבות.
לעומת זאת, חבילת הצד השלישי goquery
, המושראת מ-jQuery, מציעה ממשק ברמה גבוהה יותר המפשט את התמצאות והעברה ב-DOM. היא מאפשרת למפתחים לכתוב קוד תמציתי ובעל ביטוי עבור משימות כמו בחירת אלמנטים, חילוץ תכונות ושינוי תוכן.
עם זאת, הנוחות שמציעה goquery
באה על חשבון תלות נוספת וביצועים פוטנציאלית איטיים יותר בגלל שכבת ההפשטה שלה. הבחירה בין net/html
לבין goquery
(או ספריות ניתוח אחרות) תלויה בדרישות הספציפיות של הפרויקט, כגון הצורך באופטימיזציה של ביצועים או נוחות שימוש.
היסטורית, ניתוח HTML ב-Go התפתח מפעולות עיבוד מחרוזות בסיסיות לשינוי מורכב של עצי DOM, משקף את האקוסיסטם הגדל של השפה ואת דרישת הקהילה לכלים חזקים לגריפת אתרים וחציבת נתונים. למרות היכולות המקוריות, השימוש הנרחב בספריות צד שלישי כמו goquery
מדגיש את העדפת הקהילה של Go לקוד מודולרי וניתן לשימוש חוזר. עם זאת, ליישומים קריטיים בביצועים, מתכנתים עשויים עדיין להעדיף את חבילת net/html
או אף להיעזר בביטויים רגולריים למשימות ניתוח פשוטות, תוך שמירה על הסיכונים והמגבלות הכרוכות בניתוח HTML באמצעות ביטויים רגולריים.