我想用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'
。我相信有一些明显的解决方案,但是某种程度上它使我想不到。
谢谢。
答案 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);