ฉันจะแยกวิเคราะห์หน้า HTML ด้วย Node.js ได้อย่างไร


92

ฉันต้องการแยกวิเคราะห์หน้า HTML จำนวนมาก (ฝั่งเซิร์ฟเวอร์)
เราทุกคนยอมรับว่า regexp ไม่ใช่วิธีที่จะไปที่นี่
สำหรับฉันแล้วดูเหมือนว่าจาวาสคริปต์เป็นวิธีดั้งเดิมในการแยกวิเคราะห์หน้า HTML แต่สมมติฐานนั้นอาศัยโค้ดฝั่งเซิร์ฟเวอร์ที่มีจาวาสคริปต์ความสามารถ DOM ทั้งหมดที่มีอยู่ในเบราว์เซอร์

Node.js มีความสามารถในตัวหรือไม่
มีแนวทางที่ดีกว่าสำหรับปัญหานี้หรือไม่โดยแยกวิเคราะห์ HTML ทางฝั่งเซิร์ฟเวอร์

คำตอบ:


87

คุณสามารถใช้NPMโมดูลjsdomและhtmlparserในการสร้างและแยก DOM ใน Node.JS.

ตัวเลือกอื่น ๆ ได้แก่ :

  • BeautifulSoupสำหรับหลาม
  • คุณสามารถแปลงhtml เป็น xhtmlและใช้ XSLT
  • HTMLAgilityPackสำหรับ. NET
  • CsQueryสำหรับ. NET (รายการโปรดใหม่ของฉัน)
  • เอ็นจิ้น spidermonkey และแรด JS รองรับ E4X ดั้งเดิม สิ่งนี้อาจมีประโยชน์ก็ต่อเมื่อคุณแปลง html เป็น xhtml

จากตัวเลือกเหล่านี้ทั้งหมดฉันชอบใช้ตัวเลือก Node.js เพราะใช้วิธีการเข้าถึง W3C DOM มาตรฐานและฉันสามารถใช้รหัสซ้ำได้ทั้งในไคลเอนต์และเซิร์ฟเวอร์ ฉันหวังว่าวิธีการของ BeautifulSoup จะคล้ายกับ W3C dom มากกว่าและฉันคิดว่าการแปลง HTML ของคุณเป็น XHTML เพื่อเขียน XSLT นั้นเป็นเพียงแค่ซาดิสม์ธรรมดา


3
คุณหมายถึงอะไร? เชื่อถือได้รวดเร็วง่าย? ดีกับทั้งสองก็พอที่แข็งแกร่งเพื่อให้คุณสามารถใช้ jQuery serverside ถ้าคุณต้องการที่จะ
kzh

1
@kzh ความน่าเชื่อถือและง่ายมีความสำคัญสำหรับฉันมากกว่าถ้ากระบวนการสิ้นสุดในหนึ่งชั่วโมงหรือหนึ่งวัน
Itay Moav -Malimovka

ฉันจะบอกว่าตัวเลือกโหนดนั้นเชื่อถือได้และง่ายมากหากคุณคุ้นเคยกับ DOM อยู่แล้ว
kzh

หากคุณถ่ายโดยใช้ htmlparser ให้ลองใช้github.com/fb55/node-htmlparserก่อน ดูเหมือนว่าจะเป็นเวอร์ชันที่ปรับปรุงใหม่และได้รับการบำรุงรักษามากขึ้น
cburgmer

ฉันค้นหาในอินเทอร์เน็ต แต่ไม่พบบทแนะนำที่ดีสำหรับ htmlparser ..
songyy

63

ใช้Cheerio ไม่เข้มงวดเท่า jsdom และเหมาะสำหรับการขูด เป็นโบนัสใช้ตัวเลือก jQuery ที่คุณรู้จักอยู่แล้ว

❤ไวยากรณ์ที่คุ้นเคย: Cheerio ใช้ชุดย่อยของ jQuery หลัก Cheerio ลบความไม่สอดคล้องกันของ DOM ทั้งหมดและส่วนที่ขาดของเบราว์เซอร์ออกจากไลบรารี jQuery เผยให้เห็น API ที่สวยงามอย่างแท้จริง

ϟเร็วมาก: Cheerio ทำงานร่วมกับโมเดล DOM ที่เรียบง่ายและสอดคล้องกัน ด้วยเหตุนี้การแยกวิเคราะห์การจัดการและการแสดงผลจึงมีประสิทธิภาพอย่างไม่น่าเชื่อ เกณฑ์มาตรฐาน end-to-end เบื้องต้นชี้ให้เห็นว่า cheerio เร็วกว่า JSDOM ประมาณ 8 เท่า

❁ยืดหยุ่นอย่างบ้าคลั่ง: Cheerio ล้อมรอบ htmlparser ที่ให้อภัยของ @ FB55 Cheerio สามารถแยกวิเคราะห์เอกสาร HTML หรือ XML ได้เกือบทั้งหมด


8
แต่ไม่สร้าง DOM และไม่อนุญาต XPath ไวยากรณ์ jQuery เป็นข้อเสียของไลบรารีนั้นอย่างแน่นอน
polkovnikov.ph

2
@ polkovnikov.ph จากประสบการณ์ของฉันมีแอปพลิเคชันน้อยมากที่ต้องการการแยกวิเคราะห์ DOM แบบเต็มและการสร้าง DOM นั้นมีราคาแพงมากเมื่อเทียบกับการประเมิน "ขี้เกียจ" ที่รวดเร็วใน jQuery / Cheerio ในแง่นี้การแยกวิเคราะห์สไตล์ jQuery เป็นประโยชน์ แต่ถ้าแอปพลิเคชันของคุณต้องการการจัดการฝั่งเซิร์ฟเวอร์ DOM คุณอาจต้องการลองใช้ jsdom
Meekohi

jsdomช้าเกินไปสำหรับสิ่งนั้น: /
polkovnikov.ph

2
@MohamedMansour สำหรับสิ่งที่คุ้มค่าที่เราใช้ Cheerio ในการผลิตและขูดหลายพันหน้าในไม่กี่วินาที "เร็ว" และ "ช้า" ล้วนสัมพันธ์กับแอปพลิเคชันและแบนด์วิดท์ของคุณแน่นอน
Meekohi

ไม่เข้มงวด: +1 jQuery ไวยากรณ์: +1
cheesus

11

ใช้htmlparser2ซึ่งเร็วกว่าและค่อนข้างตรงไปตรงมา ดูตัวอย่างการใช้งานนี้:

https://www.npmjs.org/package/htmlparser2#usage

และการสาธิตสดที่นี่:

http://demos.forbeslindesay.co.uk/htmlparser2/


วิธีการรับผลลัพธ์ที่แน่นอนที่ได้รับในการสาธิตนี้?
Penguin9

6

Htmlparser2โดย FB55 น่าจะเป็นทางเลือกที่ดี


3
แล้วรูปแบบการส่งคืนนี้ควรทำอย่างไร เขียนพวงสำหรับลูปและการลัดเลาะต้นไม้?
polkovnikov.ph

คุณสามารถลงทะเบียนเพื่อเปิด / ปิดแท็กเหตุการณ์ได้ดังนั้นนี่จึงเป็นทางเลือกที่ดีมากสำหรับ imho ทั้งนี้ขึ้นอยู่กับว่าคุณต้องการอะไร
ฟิลิป

@ polkovnikov.ph นอกจากนี้ยังมีแพ็กเกจdomutilsโดยผู้เขียนคนเดียวกันที่ทำงานกับรูปแบบที่ส่งคืนโดย htmlparser2 ซึ่งมีวิธีการมากมายซึ่งบางส่วนมีไวยากรณ์เดียวกันกับวิธี DOM บางส่วนก็แตกต่างกัน คุณไม่จำเป็นต้องสำรวจวัตถุด้วยตนเองจริงๆ ไม่มีเอกสารอยู่ที่นั่น แต่ซอร์สโค้ดนั้นชัดเจนมากทุกอย่างทำงานได้ตามที่คุณคาดหวัง
esp

ยังไม่ได้หยุด แต่คุณจะขยายอะไร การใช้ฟังก์ชันที่มีอยู่แล้วไม่ใช่เรื่องยาก
esp

2

jsdom เข้มงวดเกินไปที่จะทำการคัดลอกหน้าจอจริง ๆ แต่ beautifulsoup ไม่สำลักมาร์กอัปที่ไม่ดี

node-soupselectเป็นพอร์ตของ beautifulsoup ของ python ไปยัง nodejs และทำงานได้อย่างสวยงาม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.