在Node.js中使用htmlparse2选择html节点的文本内容

时间:2019-05-27 00:12:50

标签: javascript node.js parsing html-parsing

我想用htmlparse2模块为Node.js解析一些html。我的任务是通过其ID查找精确的元素并提取其文本内容。

我已经阅读了documentation(非常有限),并且我知道如何使用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 个答案:

答案 0 :(得分: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.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”。但是,我认为您会发现,仅使用针对此目的的查询库会更容易。您当然不需要这样做,但是您可以注意到以下代码更简单:How do I get an element name in cheerio with node.js

Cheerio或https://www.npmjs.com/package/node-html-parser之类的querySelector API,如果您更喜欢本机查询选择器,则更为精益。

您可以将该代码与更精简的代码进行比较,例如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);