Як проаналізувати 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 (мій новий улюблений)
  • Двигуни spidermonkey та rhino JS мають вбудовану підтримку E4X. Це може бути корисним, лише якщо ви конвертуєте свій html у xhtml.

З усіх цих параметрів я віддаю перевагу використанню опції Node.js, оскільки вона використовує стандартні методи доступу W3C DOM, і я можу повторно використовувати код як на клієнті, так і на сервері. Я хотів би, щоб методи BeautifulSoup були більше схожі на W3C dom, і я думаю, що перетворення вашого HTML у XHTML для написання XSLT є просто садистичним.


3
Що ви маєте на увазі під добром? Надійний, швидкий, легкий? Ну з цими двома він досить надійний, щоб ви могли використовувати jQuery на стороні сервера, якщо хочете .
kzh

1
@kzh Надійне та легке для мене важливіше, якщо процес закінчується за одну годину чи один день.
Itay Moav -Malimovka

Я б сказав, що варіант вузла надійний і, безумовно, простий, якщо ви вже звикли до DOM.
kzh

Якщо ви знімаєте для htmlparser, спробуйте спочатку перейти на github.com/fb55/node-htmlparser . Це, здається, перероблена версія і більш активно підтримується.
cburgmer

Я шукав по всьому Інтернету, але не можу знайти хорошого підручника для htmlparser ..
songyy

62

Використовуйте 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 у виробництві та вишкрібаємо тисячі сторінок за кілька секунд. "швидкий" і "повільний" - це все, що стосується вашої програми та пропускної здатності, звичайно.
Meekohi

Несуворі: +1. Синтаксис jQuery: +1.
cheesus

11

Використовуйте htmlparser2 , швидше і досить просто. Зверніться до цього прикладу використання:

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

І демонстрація в прямому ефірі тут:

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


Як отримати точний вид результату, який отримує людина в цій демонстрації?
RaisingAgent

6

Htmlparser2 від FB55, здається, є хорошою альтернативою.


3
І що робити з цим форматом повернення ? Написати купу для петель і обходів дерев?
polkovnikov.ph

Ви можете зареєструватися, щоб відкривати / закривати події тегів, тому, залежно від того, що ви хочете, це дійсно хороша альтернатива imho.
Філ

@ polkovnikov.ph Існує також пакет domutils того самого автора, який працює з форматом, повернутим htmlparser2 - у ньому є безліч методів, деякі з яких мають такий самий синтаксис, як методи DOM, деякі різні; вам не потрібно буде обходити об'єкт вручну. Документів там немає, але вихідний код надзвичайно зрозумілий - все працює так, як і слід було очікувати.
esp

ще ні, але що заважає вам продовжувати його? це не так складно використовувати вже наявні функції.
esp

2

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

node-soupselect - це порт прекрасної суми python у nodejs, і він чудово працює

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.