Node.js ile bir HTML sayfasını nasıl ayrıştırırım?


94

Büyük miktarda HTML sayfasını (sunucu tarafında) ayrıştırmam gerekiyor.
Hepimiz regexp'in buraya gitmek için yol olmadığı konusunda hemfikiriz.
Bana öyle geliyor ki javascript, bir HTML sayfasını ayrıştırmanın yerel yolu, ancak bu varsayım, javascript'in bir tarayıcının içinde sahip olduğu tüm DOM yeteneğine sahip sunucu tarafı koduna dayanıyor.

Node.js yerleşik olarak bu yeteneğe sahip mi?
HTML'yi sunucu tarafında ayrıştırarak bu soruna daha iyi bir yaklaşım var mı?

Yanıtlar:


87

Node.JS'de bir DOM oluşturmak ve ayrıştırmak için jsdom ve htmlparser npm modüllerini kullanabilirsiniz.

Diğer seçenekler şunları içerir:

  • Python için BeautifulSoup
  • html'yi xhtml'ye dönüştürebilir ve XSLT kullanabilirsiniz
  • .NET için HTMLAgilityPack
  • .NET için CsQuery (yeni favorim)
  • Spidermonkey ve rhino JS motorları yerel E4X desteğine sahiptir. Bu, yalnızca html'nizi xhtml'ye dönüştürürseniz yararlı olabilir.

Tüm bu seçeneklerden Node.js seçeneğini kullanmayı tercih ediyorum, çünkü standart W3C DOM erişimci yöntemlerini kullanıyor ve kodu hem istemcide hem de sunucuda yeniden kullanabiliyorum. BeautifulSoup'un yöntemlerinin W3C doma daha benzer olmasını diliyorum ve XSLT yazmak için HTML'nizi XHTML'ye dönüştürmenin sadece sadistçe olduğunu düşünüyorum.


3
İyi ile ne demek istiyorsun? Güvenilir, hızlı, kolay mı? Bu ikisiyle, yeterince sağlamdır, böylece isterseniz jQuery serveride kullanabilirsiniz .
kzh

1
@kzh Güvenilir ve kolay benim için süreç bir saat veya bir günde biterse daha önemli.
Itay Moav -Malimovka

Düğüm seçeneğinin güvenilir olduğunu ve DOM'a zaten alışkınsanız kesinlikle kolay olduğunu söyleyebilirim.
kzh

Htmlparser için çekim yapıyorsanız, önce github.com/fb55/node-htmlparser ile gitmeyi deneyin . Yeniden işlenmiş bir versiyon gibi görünüyor ve daha aktif bir şekilde korunuyor.
cburgmer

İnternetin her yerinde aradım ancak htmlparser için iyi bir eğitim bulamıyorum ..
songyy

63

Cheerio kullan . Jsdom kadar katı değildir ve kazıma için optimize edilmiştir. Bonus olarak, zaten bildiğiniz jQuery seçicilerini kullanır.

❤ Tanıdık sözdizimi: Cheerio, çekirdek jQuery'nin bir alt kümesini uygular. Cheerio, jQuery kitaplığından tüm DOM tutarsızlıklarını ve tarayıcı bozukluklarını ortadan kaldırarak gerçekten muhteşem API'sini ortaya çıkarır.

ϟ Son derece hızlı: Cheerio, çok basit, tutarlı bir DOM modeliyle çalışır. Sonuç olarak ayrıştırma, işleme ve oluşturma inanılmaz derecede etkilidir. Ön uçtan-uca karşılaştırmalar, cheerio'nun JSDOM'dan yaklaşık 8 kat daha hızlı olduğunu gösteriyor.

❁ Son derece esnek: Cheerio, @ FB55'in bağışlayıcı htmlparser'ını sarar. Cheerio hemen hemen her HTML veya XML belgesini ayrıştırabilir.


8
Ancak DOM oluşturmaz ve XPath'e izin vermez. jQuery sözdizimi kesinlikle bu kitaplığın bir dezavantajıdır.
polkovnikov.ph

2
@ polkovnikov.ph benim tecrübelerime göre çok az uygulama tam DOM ayrıştırmasını gerektiriyor ve DOM'u oluşturmak jQuery / Cheerio'daki hızlı "tembel" değerlendirmeye kıyasla çok pahalı. Bu anlamda jQuery tarzı ayrıştırma bir avantajdır, ancak uygulamanız DOM sunucu tarafını değiştirmeyi gerektiriyorsa, jsdom'u denemeyi tercih edebilirsiniz.
Meekohi

jsdombunun için çok yavaş: /
polkovnikov.ph

2
@MohamedMansour değeri ne olursa olsun Cheerio'yu üretimde kullanıyoruz ve birkaç saniyede binlerce sayfayı kazıyıyoruz. "hızlı" ve "yavaş" ifadelerinin tümü uygulamanıza ve tabii ki bant genişliğine bağlıdır.
Meekohi

Katı olmayan: +1. jQuery sözdizimi: +1.
2019


6

FB55 tarafından hazırlanan Htmlparser2 iyi bir alternatif gibi görünüyor.


3
Ve bu dönüş biçimiyle ne yapılmalı ? Döngüler ve ağaç geçişleri için bir demet mi yazacaksınız?
polkovnikov.ph

Etiket etkinliklerini açmak / kapatmak için kayıt olabilirsiniz, bu nedenle ne istediğinize bağlı olarak bu gerçekten iyi bir alternatif imho'dur.
Phil

@ polkovnikov.ph Aynı yazara ait, htmlparser2 tarafından döndürülen formatla çalışan domutils paketi de var - birçok metodu var, bazıları DOM metotlarıyla aynı sözdizimine sahip, bazıları farklı; nesneyi gerçekten manuel olarak geçmeniz gerekmeyecek. Orada belge yok, ancak kaynak kodu çok net - hepsi beklediğiniz gibi çalışıyor.
özellikle

henüz değil, ama onu genişletmenizi engelleyen nedir? zaten sahip olduğu işlevleri kullanmak o kadar da zor değil.
özellikle


0

Kasım 2020 Güncellemesi

En iyi NodeJS html ayrıştırıcı kitaplıklarını aradım.

Kullanım senaryolarım birçok özelliğe sahip bir kitaplık gerektirmediğinden, kararlılık ve performansa odaklanabildim.

Kararlılık derken, kütüphanenin topluluk tarafından hataların bulunması için yeterince uzun süre kullanılmasını ve korunmaya devam edileceğini ve açık sorunların kapatılacağını kastediyorum.

Açık kaynak kodlu bir kütüphanenin geleceğini anlamak zor, ancak openbase'deki en iyi 10 kütüphaneyi temel alan küçük bir özet yaptım .

Son işleme göre 2 gruba ayrıldım (ve her grupta sıra Github başlar):

Son taahhüt, son 6 aydır:

jsdom - Last commit: 3 Months, Open issues: 331, Github stars: 14.9K.

htmlparser2 - Last commit: 8 days, Open issues: 2, Github stars: 2.7K.

parse5 - Last commit: 2 Months, Open issues: 21, Github stars: 2.5K.

swagger-ayrıştırıcı - Last commit: 2 Months, Open issues: 48, Github stars: 663.

html-ayrıştırma-stringify - Last commit: 4 Months, Open issues: 3, Github stars: 215.

düğüm-html-ayrıştırıcı - Last commit: 7 days, Open issues: 15, Github stars: 205.

Son taahhüt 6 ay ve üzeridir:

cheerio - Last commit: 1 year, Open issues: 174, Github stars: 22.9K.

koa-bodyparser - Last commit: 6 months, Open issues: 9, Github stars: 1.1K.

sax-js - Last commit: 3 Years, Open issues: 65, Github stars: 941.

draftjs-html - Last commit: 1 Year, Open issues: 27, Github stars: 233.


Node-html-parser'ı seçtim çünkü şu anda oldukça hızlı ve çok aktif görünüyor.

(*) Openbase, katkıda bulunanların sayısı (+3 kaydetme ile), haftalık indirmeler, Aylık taahhütler, Sürüm vb. Gibi her kitaplıkla ilgili çok daha fazla bilgi ekler.

(**) Yukarıdaki tablo, belirli saat ve tarihe göre bir anlık görüntüdür - Referansı tekrar kontrol eder ve ilk adım olarak son etkinlik düzeyini kontrol eder ve ardından daha küçük ayrıntılara dalardım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.