Выбор текстового содержимого узла html с помощью htmlparser2 в Node.js

Я хочу разобрать html с модулем htmlparser2 для Node.js. Моя задача — найти точный элемент по его идентификатору и извлечь его текстовое содержимое.

Я прочитал документация (весьма ограниченный) и знаю, как настроить парсер с помощью функции onopentag, но он дает доступ только к имени тега и его атрибутам (я не вижу текста). Функция ontext извлекает все текстовые узлы из заданной строки html, но игнорирует всю разметку.

Итак, вот мой код.

const htmlparser = require("htmlparser2");
const file = '<h1 id = "heading1">Some heading</h1><p>Foobar</p>';

const parser = new htmlparser.Parser({
  onopentag: function(name, attribs){
    if (attribs.id === "heading1"){
      console.info(/*how to extract text so I can get "Some heading" here*/);
    }
  },
   
  ontext: function(text){
    console.info(text); // Some heading \n Foobar
  }
});

parser.parseComplete(file);

Я ожидаю, что вывод вызова функции будет 'Some heading'. Я считаю, что есть какое-то очевидное решение, но почему-то оно не приходит мне в голову.

Спасибо.

Есть ли причина, по которой вы хотите использовать эту конкретную библиотеку? Тебе обязательно? Для некоторых людей что-то вроде Cheerio немного проще в использовании, поскольку у него есть интерфейс, похожий на jQuery, который вы можете использовать.

Vaughan Hilts 27.05.2019 02:47

Спасибо за вопрос. Нет, мне не нужно использовать эту конкретную библиотеку, но она кажется довольно популярной и быстрой. Что касается Cheerio, я не знаю jQuery, поэтому мне он кажется не очень дружелюбным.

dekross 27.05.2019 03:13

Я тебе что-нибудь напишу. Я не думаю, что синтаксический анализатор - это способ сделать это.

Vaughan Hilts 27.05.2019 03:22

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

Vaughan Hilts 27.05.2019 03:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
4
4 323
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это так, используя библиотеку, о которой вы спрашивали:

const htmlparser = require('htmlparser2');
const domUtils = require('domutils');

const file = '<h1 id = "heading1">Some heading</h1><p>Foobar</p>';

var handler = new htmlparser.DomHandler(function(error, dom) {
  if (error) {
    console.info('Parsing had an error');
    return;
  } else {
    const item = domUtils.findOne(element => {
      const matches = element.attribs.id === 'heading1';
      return matches;
    }, dom);

    if (item) {
      console.info(item.children[0].data);
    }
  }
});

var parser = new htmlparser.Parser(handler);
parser.write(file);
parser.end();

На выходе вы получите "Some Heading". Однако, на мой взгляд, вам будет проще просто использовать библиотеку запросов, предназначенную для этого. Вам, конечно, этого делать не нужно, но вы можете заметить, насколько проще следующий код: Как получить имя элемента в cheerio с помощью node.js

Cheerio ИЛИ API-интерфейс querySelector, такой как https://www.npmjs.com/package/node-html-parser, если вы предпочитаете собственные селекторы запросов, намного проще.

Вы можете сравнить этот код с чем-то более компактным, например, с node-html-parser, который поддерживает простые запросы:

const { parse } = require('node-html-parser');

const file = '<h1 id = "heading1">Some heading</h1><p>Foobar</p>';
const root = parse(file);
const text = root.querySelector('#heading1').text;
console.info(text);

Модуль node-html-parser выглядит действительно дружелюбнее. Спасибо, что решили вопрос как есть, а также предоставили альтернативу. Весьма признателен!

dekross 27.05.2019 14:22

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