Как мне разобрать 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
И живое демо здесь:
JSDOM слишком строг, чтобы делать какие-либо реальные скриншоты, но BeautifulSoup не задыхается от плохой разметки.
node-soupselect - это порт Beautifulsoup в Python для nodejs, и он прекрасно работает
В.NET есть HTML Agility Pack, который представляет собой чрезвычайно прочную библиотеку для разбора HTML.