Как мне разобрать HTML-страницу с Node.js

Мне нужно проанализировать (на стороне сервера) большое количество HTML-страниц.
Мы все согласны с тем, что регулярное выражение не путь сюда.
Мне кажется, что javascript является родным способом парсинга HTML-страницы, но это предположение основано на коде серверной части, имеющем все возможности DOM, которые есть у javascript внутри браузера.

Есть ли в Node.js эта способность?
Есть ли лучший подход к этой проблеме, анализируя HTML на стороне сервера?

6 ответов

Решение

Вы можете использовать модули npm jsdom и htmlparser для создания и анализа DOM в Node.JS.

Другие варианты включают в себя:

  • BeautifulSoup для питона
  • Вы можете конвертировать ваш HTML в XHTML и использовать XSLT
  • HTMLAgilityPack для.NET
  • CsQuery для.NET (мой новый фаворит)
  • Двигатели Spidermonkey и Rhino JS имеют встроенную поддержку E4X. Это может быть полезно, только если вы конвертируете html в xhtml.

Из всех этих опций я предпочитаю использовать опцию Node.js, потому что она использует стандартные методы доступа W3C DOM, и я могу повторно использовать код как на клиенте, так и на сервере. Мне бы хотелось, чтобы методы BeautifulSoup были больше похожи на W3C dom, и я думаю, что преобразование вашего HTML в XHTML для написания XSLT просто садистское.

Используйте Cheerio. Он не такой строгий, как jsdom, и оптимизирован для очистки. В качестве бонуса используются селекторы jQuery, которые вы уже знаете.

❤ Знакомый синтаксис: Cheerio реализует подмножество ядра jQuery. Cheerio удаляет все несоответствия DOM и ненужные браузеры из библиотеки jQuery, раскрывая ее действительно великолепный API.

fast Слишком быстро: Cheerio работает с очень простой последовательной моделью DOM. В результате анализ, манипулирование и рендеринг невероятно эффективны. Предварительные сквозные тесты показывают, что cheerio примерно в 8 раз быстрее, чем JSDOM.

Flexible Безумно гибко: Cheerio обволакивает прощающий htmlparser @FB55. Cheerio может анализировать практически любой HTML или XML документ.

Обновление за ноябрь 2020 г.

Я искал лучшие библиотеки синтаксического анализатора NodeJS html.

Поскольку моим вариантам использования не требовалась библиотека с множеством функций, я мог сосредоточиться на стабильности и производительности.

Под стабильностью я подразумеваю, что я хочу, чтобы библиотека использовалась сообществом достаточно долго, чтобы найти ошибки, и что она будет поддерживаться, а открытые вопросы будут закрыты.

Трудно понять будущее библиотеки с открытым исходным кодом, но я сделал небольшое резюме, основанное на 10 лучших библиотеках openbase.

Я разделил на 2 группы в соответствии с последней фиксацией (и в каждой группе порядок соответствует запускам Github):

Последняя фиксация за последние 6 месяцев:

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.

чванство-парсер - Last commit: 2 Months, Open issues: 48, Github stars: 663.

html-parse-stringify - Last commit: 4 Months, Open issues: 3, Github stars: 215.

узел-html-парсер - Last commit: 7 days, Open issues: 15, Github stars: 205.

Последняя фиксация - 6 месяцев и выше:

привет - 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-to-html - Last commit: 1 Year, Open issues: 27, Github stars: 233.


Я выбрал Node-html-parser, потому что в данный момент он кажется тихим, быстрым и очень активным.

(*) Openbase добавляет гораздо больше информации о каждой библиотеке, такой как количество участников (с +3 коммитами), еженедельные загрузки, ежемесячные коммиты, версия и т. Д. ".

(**) Приведенная выше таблица представляет собой снимок в соответствии с конкретным временем и датой - я бы еще раз проверил ссылку и в качестве первого шага проверил уровень недавней активности, а затем погрузился в более мелкие детали.

Используйте htmlparser2, он быстрее и довольно прост. Посмотрите этот пример использования:

https://www.npmjs.org/package/htmlparser2

И живое демо здесь:

http://demos.forbeslindesay.co.uk/htmlparser2/

Htmlparser2 от FB55 кажется хорошей альтернативой.

JSDOM слишком строг, чтобы делать какие-либо реальные скриншоты, но BeautifulSoup не задыхается от плохой разметки.

node-soupselect - это порт Beautifulsoup в Python для nodejs, и он прекрасно работает

В.NET есть HTML Agility Pack, который представляет собой чрезвычайно прочную библиотеку для разбора HTML.

Другие вопросы по тегам