Я хочу разобрать 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, поэтому мне он кажется не очень дружелюбным.
Я тебе что-нибудь напишу. Я не думаю, что синтаксический анализатор - это способ сделать это.
Я добавил ответ для вас. Библиотека, которую вы используете выше, больше предназначена для проверки структуры вещей, и ее поддержка запросов является своего рода вторым классом, насколько я понимаю. Я оставил оба примера для вас, чтобы вы могли учиться.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете сделать это так, используя библиотеку, о которой вы спрашивали:
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 выглядит действительно дружелюбнее. Спасибо, что решили вопрос как есть, а также предоставили альтернативу. Весьма признателен!
Есть ли причина, по которой вы хотите использовать эту конкретную библиотеку? Тебе обязательно? Для некоторых людей что-то вроде Cheerio немного проще в использовании, поскольку у него есть интерфейс, похожий на jQuery, который вы можете использовать.