Bagaimana cara mengurai halaman HTML dengan Node.js

92

Saya perlu mengurai (sisi server) halaman HTML dalam jumlah besar.
Kami semua setuju bahwa regexp bukanlah cara untuk menuju ke sini.
Menurut saya, javascript adalah cara asli untuk mengurai halaman HTML, tetapi asumsi tersebut bergantung pada kode sisi server yang memiliki semua kemampuan DOM yang dimiliki javascript di dalam browser.

Apakah Node.js memiliki kemampuan itu?
Apakah ada pendekatan yang lebih baik untuk masalah ini, mengurai HTML di sisi server?

Itay Moav -Malimovka
sumber

Jawaban:

87

Anda dapat menggunakan NPM modul jsdom dan htmlparser untuk membuat dan mengurai DOM di Node.js.

Pilihan lainnya termasuk:

  • BeautifulSoup untuk python
  • Anda dapat mengubah html Anda menjadi xhtml dan menggunakan XSLT
  • HTMLAgilityPack untuk .NET
  • CsQuery untuk .NET (favorit baru saya)
  • Mesin spidermonkey dan rhino JS memiliki dukungan E4X asli. Ini mungkin berguna, hanya jika Anda mengonversi html Anda ke xhtml.

Dari semua opsi ini, saya lebih suka menggunakan opsi Node.js, karena menggunakan metode aksesor DOM W3C standar dan saya dapat menggunakan kembali kode pada klien dan server. Saya berharap metode BeautifulSoup lebih mirip dengan dom W3C, dan saya pikir mengubah HTML Anda ke XHTML untuk menulis XSLT hanya sadis.

kzh
sumber
3
Apa yang Anda maksud dengan baik? Dapat diandalkan, cepat, mudah? Nah dengan keduanya, itu cukup kuat sehingga Anda dapat menggunakan jQuery serveride jika Anda mau .
kzh
1
@kzh Dapat diandalkan dan mudah lebih penting bagi saya jika prosesnya berakhir dalam satu jam atau satu hari.
Itay Moav -Malimovka
Saya akan mengatakan bahwa opsi simpul dapat diandalkan dan pasti mudah jika Anda sudah terbiasa dengan DOM.
kzh
Jika Anda memotret untuk htmlparser, coba gunakan github.com/fb55/node-htmlparser terlebih dahulu. Tampaknya versi yang dikerjakan ulang dan lebih aktif dipertahankan.
cburgmer
Saya mencari di seluruh internet tetapi tidak dapat menemukan tutorial yang bagus untuk htmlparser ..
songyy
63

Gunakan Cheerio . Ini tidak seketat jsdom dan dioptimalkan untuk scraping. Sebagai bonus, gunakan penyeleksi jQuery yang sudah Anda kenal.

❤ Sintaks yang familiar: Cheerio mengimplementasikan subset inti jQuery. Cheerio menghapus semua ketidakkonsistenan DOM dan cruft browser dari perpustakaan jQuery, mengungkapkan API yang benar-benar indah.

ϟ Sangat cepat: Cheerio bekerja dengan model DOM yang sangat sederhana dan konsisten. Hasilnya, penguraian, manipulasi, dan rendering menjadi sangat efisien. Tolok ukur end-to-end awal menunjukkan bahwa cheerio sekitar 8x lebih cepat daripada JSDOM.

❁ Sangat fleksibel: Cheerio membungkus htmlparser @ FB55 yang pemaaf. Cheerio dapat mengurai hampir semua dokumen HTML atau XML.

Meekohi
sumber
8
Tetapi tidak membangun DOM dan tidak mengizinkan XPath. sintaks jQuery pasti merupakan kelemahan dari perpustakaan itu.
polkovnikov.ph
2
@ polkovnikov.ph menurut pengalaman saya sangat sedikit aplikasi yang memerlukan parsing DOM penuh, dan membangun DOM sangat mahal dibandingkan dengan evaluasi "malas" yang cepat di jQuery / Cheerio. Dalam hal ini, penguraian gaya jQuery bermanfaat, tetapi jika aplikasi Anda memerlukan manipulasi sisi server DOM, Anda mungkin lebih suka mencoba jsdom.
Meekohi
jsdomterlalu lambat untuk itu: /
polkovnikov.ph
2
@MohamedMansour untuk manfaatnya kami menggunakan Cheerio dalam produksi dan mengumpulkan ribuan halaman dalam beberapa detik. "cepat" dan "lambat" semuanya terkait dengan aplikasi dan tentu saja bandwidth Anda.
Meekohi
Tidak ketat: +1. jQuery sintaks: +1.
cheesus
6

Htmlparser2 oleh FB55 tampaknya menjadi alternatif yang baik.

esp
sumber
3
Dan apa yang harus dilakukan dengan format pengembalian ini ? Tulis banyak untuk loop dan traversal pohon?
polkovnikov.ph
Anda dapat mendaftar untuk membuka / menutup acara tag, jadi tergantung pada apa yang Anda inginkan, ini adalah alternatif imho yang sangat bagus.
Phil
@ polkovnikov.ph Ada juga paket domutils oleh penulis yang sama yang bekerja dengan format yang dikembalikan oleh htmlparser2 - ia memiliki banyak metode, beberapa di antaranya memiliki sintaks yang sama dengan metode DOM, beberapa berbeda; Anda tidak perlu melintasi objek secara manual. Tidak ada dokumen di sana, tetapi kode sumbernya sangat jelas - semuanya berfungsi seperti yang Anda harapkan.
khususnya
belum, tapi apa yang menghentikan Anda memperpanjangnya? tidak terlalu sulit menggunakan fungsi yang sudah dimilikinya.
khususnya
2

jsdom terlalu ketat untuk melakukan hal-hal seperti layar nyata, tapi beautifulsoup tidak tersedak markup yang buruk.

node-soupselect adalah port beautifulsoup python ke nodejs, dan berfungsi dengan baik

Yarek T
sumber