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?

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.


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.


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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.