Jak przeanalizować stronę HTML za pomocą Node.js.

92

Muszę przeanalizować (po stronie serwera) duże ilości stron HTML.
Wszyscy zgadzamy się, że regexp nie jest właściwą drogą.
Wydaje mi się, że javascript jest natywnym sposobem parsowania strony HTML, ale założenie to opiera się na kodzie po stronie serwera, który ma wszystkie możliwości DOM, jakie javascript ma w przeglądarce.

Czy Node.js ma wbudowaną taką możliwość?
Czy jest lepsze podejście do tego problemu, analizowanie kodu HTML po stronie serwera?

Itay Moav -Malimovka
źródło

Odpowiedzi:

87

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

Inne opcje obejmują:

  • BeautifulSoup dla Pythona
  • możesz przekonwertować swój html na xhtml i używać XSLT
  • HTMLAgilityPack dla .NET
  • CsQuery dla .NET (mój nowy ulubiony)
  • Silniki spidermonkey i rhino JS mają natywną obsługę E4X. Może to być przydatne tylko wtedy, gdy przekonwertujesz swój html na xhtml.

Spośród wszystkich tych opcji wolę używać opcji Node.js, ponieważ używa ona standardowych metod dostępu W3C DOM i mogę ponownie wykorzystać kod zarówno na kliencie, jak i na serwerze. Chciałbym, żeby metody BeautifulSoup były bardziej podobne do W3C dom i myślę, że konwersja twojego HTML na XHTML w celu napisania XSLT jest po prostu sadystyczna.

kzh
źródło
3
Co masz na myśli mówiąc „dobro”? Niezawodny, szybki, łatwy? Cóż, z tymi dwoma jest wystarczająco solidne, abyś mógł używać serwera jQuery, jeśli chcesz .
kzh
1
@kzh Niezawodne i łatwe są dla mnie ważniejsze niż wtedy, gdy proces kończy się za godzinę lub jeden dzień.
Itay Moav -Malimovka
Powiedziałbym, że opcja węzła jest niezawodna i zdecydowanie łatwa, jeśli jesteś już przyzwyczajony do DOM.
kzh
Jeśli strzelasz dla htmlparser, spróbuj najpierw użyć github.com/fb55/node-htmlparser . Wydaje się, że jest to przerobiona wersja i jest bardziej aktywnie rozwijana.
cburgmer
Szukałem w całym Internecie, ale nie mogę znaleźć dobrego samouczka dla htmlparser ..
songyy
63

Użyj Cheerio . Nie jest tak rygorystyczny jak jsdom i jest zoptymalizowany pod kątem skrobania. Jako bonus, używa selektorów jQuery, które już znasz.

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

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

❁ Niezwykle elastyczny: Cheerio otacza wybaczający htmlparser @ FB55. Cheerio może przeanalizować prawie każdy dokument HTML lub XML.

Meekohi
źródło
8
Ale nie buduje DOM i nie zezwala na XPath. Składnia jQuery jest z pewnością wadą tej biblioteki.
polkovnikov.ph
2
@ polkovnikov.ph Z mojego doświadczenia wynika, że ​​bardzo niewiele aplikacji wymaga pełnego parsowania DOM, a budowanie DOM jest bardzo kosztowne w porównaniu z szybką "leniwą" oceną w jQuery / Cheerio. W tym sensie parsowanie w stylu jQuery jest zaletą, ale jeśli twoja aplikacja wymaga manipulowania po stronie serwera DOM, możesz wypróbować jsdom.
Meekohi,
jsdomjest na to zbyt wolny: /
polkovnikov.ph
2
@MohamedMansour, bo warto, używamy Cheerio do produkcji i zeskrobujemy tysiące stron w kilka sekund. „Szybka” i „wolna” są oczywiście zależne od aplikacji i przepustowości.
Meekohi
Niestandardowe: +1. Składnia jQuery: +1.
cheesus
6

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

zwł
źródło
3
A co należy zrobić z tym formatem zwrotu ? Napisać kilka pętli i przejść przez drzewa?
polkovnikov.ph
Możesz zarejestrować się, aby otworzyć / zamknąć zdarzenia tagów, więc w zależności od tego, co chcesz, jest to naprawdę dobra alternatywa imho.
Phil
@ polkovnikov.ph Istnieje również pakiet domutils tego samego autora, który pracuje z formatem zwracanym przez htmlparser2 - ma wiele metod, z których niektóre mają taką samą składnię jak metody DOM, inne są różne; tak naprawdę nie będziesz musiał ręcznie przechodzić przez obiekt. Nie ma tam dokumentów, ale kod źródłowy jest bardzo przejrzysty - wszystko działa zgodnie z oczekiwaniami.
szczególnie
jeszcze nie, ale co powstrzymuje cię przed przedłużeniem? korzystanie z funkcji, które już posiada, nie jest takie trudne.
szczególnie
2

jsdom jest zbyt rygorystyczna, aby robić jakiekolwiek rzeczy z prawdziwego skrobania ekranu, ale beautifulsoup nie dławi się złymi znacznikami.

node-soupselect jest portem pięknej zupy Pythona na nodejs i działa pięknie

Yarek T
źródło