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
หรือแม้กระทั่งย้อนกลับไปใช้ regex สำหรับงานการวิเคราะห์ที่ง่าย, โดยคำนึงถึงความเสี่ยงและข้อจำกัดของการวิเคราะห์ HTML โดยใช้ regex