2011-09-10 21 views
72

Potrzebuję parsować (po stronie serwera) duże ilości stron HTML.
Wszyscy zgadzamy się, że regexp nie jest sposobem, aby przejść tutaj.
Wydaje mi się, że javascript jest rodzimym sposobem parsowania strony HTML, ale to założenie opiera się na kodzie strony serwera, który ma wszystkie właściwości JavaScript javascript w przeglądarce.Jak analizować stronę HTML za pomocą Node.js

Czy Node.js ma wbudowaną tę zdolność?
Czy istnieje lepsze podejście do tego problemu, parsowanie kodu HTML po stronie serwera?

Odpowiedz

66

Możesz użyć modułów npmjsdom i htmlparser, aby utworzyć i przeanalizować DOM w Node.JS.

Inne opcje obejmują:

  • BeautifulSoup dla pytona
  • można przekonwertować Ci html to xhtml i użyć XSLT
  • HTMLAgilityPack NET
  • CsQuery NET (moje ulubione)
  • Silniki JS Spidermonkey i Rhino mają natywną obsługę E4X. Może to być przydatne, tylko po konwersji html na xhtml.

Spośród wszystkich tych opcji wolę korzystać z opcji Node.js, ponieważ wykorzystuje ona standardowe metody dostępu W3C DOM i mogę ponownie użyć kodu zarówno na kliencie, jak i na serwerze. Chciałbym, aby metody BeautifulSoup były bardziej podobne do W3C i myślę, że konwersja twojego HTML'a do XHTML do pisania XSLT jest po prostu sadystyczna.

+3

jest to dobre podejście do analizowania HTML przy użyciu node.js chociaż? –

+3

Co masz na myśli przez dobre? Niezawodny, szybki i łatwy? Dobrze z tymi dwoma, jest wystarczająco solidny, dzięki czemu można [użyć serwera jQuery, jeśli chcesz] (http://stackoverflow.com/questions/1801160/can-i-use-jquery-with-node-js). – kzh

+5

+1 - Jeśli chcesz korzystać z Węzła, jest to właściwa droga. – josh3736

0

W .NET znajduje się HTML Agility Pack, która jest wyjątkowo solidną biblioteką do analizy parsowania HTML.

+3

Czy to działa z Node.JS? – kzh

+4

@kzh: Nie, ale moja lektura pytania (i OP's [komentarz] (http://stackoverflow.com/questions/7372972/how-do-i-parse-a-mlml-page-with-node- js/7373003 # comment-8899571)) jest to, że jest otwarty na inne alternatywy [inne niż w Node]. – josh3736

4

Htmlparser2 przez FB55 wydaje się być dobrą alternatywą.

+3

Co należy zrobić z [tym formatem zwrotu] (http://demos.forbeslindesay.co.uk/htmlparser2/)? Napisz kilka pętli for i przeszukiwania drzewa? –

+0

Możesz zarejestrować się, aby otwierać/zamykać zdarzenia tagów, więc w zależności od tego, co chcesz, jest to naprawdę dobra alternatywa imho. – Phil

+0

@ polkovnikov.ph Istnieje również pakiet [domutils] (https://github.com/FB55/domutils) tego samego autora, który działa z formatem zwróconym przez htmlparser2 - ma wiele metod, z których niektóre mają takie same składnia jako metody DOM, niektóre są różne; tak naprawdę nie będziesz musiał ręcznie przechodzić przez obiekt. Brak dokumentów, ale kod źródłowy jest bardzo jasny - wszystko działa tak, jak można się spodziewać. – esp

1

jsdom jest zbyt rygorystyczny, by zrobić jakikolwiek prawdziwy skrobak na ekranie, ale beautifulsoup nie dławi złych znaczników.

node-soupselect jest port BeautifulSoup Pythona do nodejs i działa pięknie

52

Zastosowanie Cheerio. Nie jest tak ścisły jak jsdom i jest zoptymalizowany pod kątem skrobania. Jako bonus używa selektorów jQuery, które już znasz.

❤ Znana składnia: Cheerio implementuje podzbiór rdzeniowego jQuery. Cheerio usuwa wszystkie niespójności DOM i przeglądarkę cruft z biblioteki jQuery , ujawniając jej naprawdę wspaniały interfejs API.

ϟ Niesamowicie szybki: Cheerio działa z bardzo prostym, spójnym modelem DOM . W rezultacie parsowanie, manipulowanie i renderowanie są niezwykle wydajne. Wstępne testy porównawcze end-to-end sugerują, że cheerio jest o około 8 razy szybsze niż JSDOM.

❁ Szalenie elastyczne: Cheerio owija się przy wybaczaniu FB55 htmlparser. Cheerio może analizować prawie każdy dokument HTML lub XML.

+6

Ale nie buduje DOM i nie pozwala na XPath. Składnia jQuery jest z pewnością wadą tej biblioteki. –

+1

@ polkovnikov.ph z mojego doświadczenia bardzo niewiele aplikacji wymaga pełnego parsowania DOM, a budowanie DOM jest bardzo drogie w porównaniu do szybkiej "leniwej" oceny w jQuery/Cheerio. W tym sensie parsowanie w stylu jQuery jest zaletą, ale jeśli twoja aplikacja wymaga manipulowania serwerem DOM, możesz spróbować jsdom. – Meekohi

+0

'jsdom' jest za wolny na to:/ –

Powiązane problemy