Выбор текстового содержимого узла html с помощью htmlparse2 в Node.js - PullRequest
0 голосов
/ 27 мая 2019

Я хочу разобрать html с помощью модуля htmlparse2 для 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.log(/*how to extract text so I can get "Some heading" here*/);
    }
  },

  ontext: function(text){
    console.log(text); // Some heading \n Foobar
  }
});

parser.parseComplete(file);

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

Спасибо.

1 Ответ

1 голос
/ 27 мая 2019

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

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.log('Parsing had an error');
    return;
  } else {
    const item = domUtils.findOne(element => {
      const matches = element.attribs.id === 'heading1';
      return matches;
    }, dom);

    if (item) {
      console.log(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.log(text);
...