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

92

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

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

Итай Моав -Малимовка
источник

Ответы:

87

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

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

  • BeautifulSoup для Python
  • вы можете преобразовать HTML в xhtml и использовать XSLT
  • HTMLAgilityPack для .NET
  • CsQuery для .NET (мой новый фаворит)
  • JS-движки spidermonkey и rhino имеют встроенную поддержку E4X. Это может быть полезно, только если вы конвертируете свой html в xhtml.

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

кж
источник
3
Что вы имеете в виду под добром? Надежно, быстро, просто? Что ж, с этими двумя, он достаточно надежен, так что вы можете использовать jQuery на стороне сервера, если хотите .
kzh
1
@kzh Для меня важнее надежность и простота, чем если процесс завершится через час или один день.
Итай Моав -Малимовка
Я бы сказал, что вариант узла надежен и определенно прост, если вы уже привыкли к DOM.
kzh
Если вы используете htmlparser, сначала попробуйте использовать github.com/fb55/node-htmlparser . Похоже, это переработанная версия, которая поддерживается более активно.
cburgmer
Я поискал по всему Интернету, но не нашел хорошего туториала по htmlparser ..
songyy
63

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

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

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

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

Микохи
источник
8
Но не строит DOM и не поддерживает XPath. Синтаксис jQuery, безусловно, является обратной стороной этой библиотеки.
polkovnikov.ph
2
@ polkovnikov.ph по моему опыту, очень немногие приложения требуют полного анализа DOM, а построение DOM очень дорого по сравнению с быстрой "ленивой" оценкой в ​​jQuery / Cheerio. В этом смысле синтаксический анализ в стиле jQuery является преимуществом, но если ваше приложение требует манипулирования серверной частью DOM, вы можете предпочесть попробовать jsdom.
Meekohi
jsdomслишком медленный для этого: /
polkovnikov.ph
2
@MohamedMansour как бы то ни было, мы используем Cheerio в продакшене и очищаем тысячи страниц за несколько секунд. «быстро» и «медленно», конечно же, относятся к вашему приложению и пропускной способности.
Микохи,
Нестрогие: +1. Синтаксис jQuery: +1.
Cheesus
11

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

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

И живая демонстрация здесь:

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

Андерсон Мадейра
источник
Как получить точный результат, который можно получить в этой демонстрации?
Penguin9
6

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

особенно
источник
3
И что делать с этим форматом возврата ? Написать кучу циклов for и обходов дерева?
polkovnikov.ph
Вы можете зарегистрироваться для открытия / закрытия событий тегов, поэтому, в зависимости от того, что вы хотите, это действительно хорошая альтернатива, imho.
Фил
@ polkovnikov.ph Существует также пакет domutils от того же автора, который работает с форматом, возвращаемым htmlparser2 - в нем много методов, некоторые из которых имеют тот же синтаксис, что и методы DOM, а некоторые другие; вам действительно не нужно будет перемещаться по объекту вручную. Документов нет, но исходный код предельно ясен - все работает так, как и следовало ожидать.
особенно
еще нет, но что вам мешает продлить его? не так уж и сложно использовать функции, которые у него уже есть.
особенно
2

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

node-soupselect - это порт beautifulsoup Python в nodejs, и он прекрасно работает

Ярек Т
источник