Javascript 如何通过字符串中的数据属性获取元素,并在node.js应用程序中获取内部文本?

Javascript 如何通过字符串中的数据属性获取元素,并在node.js应用程序中获取内部文本?,javascript,node.js,Javascript,Node.js,我是node的新手,希望我的问题不要太难看。谢谢 有一个节点应用程序,它的一部分会生成一个html站点流 .pipe(tap(function(file) { var content = file.contents.toString(), relPathPrefix = path.join(path.relative(file.path, './source')); relPathPrefix = relPathPrefix .replace(n

我是node的新手,希望我的问题不要太难看。谢谢

有一个节点应用程序,它的一部分会生成一个html站点流

.pipe(tap(function(file) {
    var content = file.contents.toString(),
        relPathPrefix = path.join(path.relative(file.path, './source'));

    relPathPrefix = relPathPrefix
        .replace(new RegExp('\\' + path.sep, 'g'), '/') // Normalize path separator
        .replace(/\.\.$/, ''); // Remove trailing ..

    content = content.replace(/('|")\//g, '$1' + relPathPrefix);
    //console.log(content)

    //here is where i`am struggling 

    file.contents = Buffer.from(content);
}))
变量“content”保存完整的网站数据。 现在我必须解析变量“content”,我将找到值为“meta.code.data”的数据属性“data type”,然后得到textContent。至少,我会从“…innerText…”这样的值中删除文本本身

我知道如何使用jQuery在浏览器中执行此操作:

var json = $('pre[data-type="meta.code.data"]').text()
还有香草JavaScript

var json = document.querySelectorAll('[data-type="meta.code.data"]')[0].textContent;
但实际上我没有找到解析字符串/变量的方法 我想到了类似的事情

content = content.contains('[data-type="meta.code.data"]')[0].textContent;

但这不起作用。

这不一样,浏览器解析DOM,这里有一个包含所有网站数据的字符串,所以旧技术不起作用。我个人会尝试使用DOM解析器(虽然我从未尝试在节点应用程序中使用它),但似乎有一个npm包的工作原理基本相同

我假设您已经将npm与Node一起使用,因此这里有一个指向确切模块的链接:

以下是其工作原理的示例:

var DOMParser = require('xmldom').DOMParser;
var doc = new DOMParser().parseFromString(
    '<xml xmlns="a" xmlns:c="./lite">\n'+
        '\t<child>test</child>\n'+
        '\t<child></child>\n'+
        '\t<child/>\n'+
    '</xml>'
    ,'text/xml');
doc.documentElement.setAttribute('x','y');
doc.documentElement.setAttributeNS('./lite','c:x','y2');
var nsAttr = doc.documentElement.getAttributeNS('./lite','x')
console.info(nsAttr)
console.info(doc)
var-DOMParser=require('xmldom').DOMParser;
var doc=new DOMParser().parseFromString(
“\n”+
“\t测试\n”+
“\t\n”+
“\t\n”+
''
,'text/xml');
doc.documentElement.setAttribute('x','y');
doc.documentElement.setAttributeNS('./lite','c:x','y2');
var nsAttr=doc.documentElement.getAttributeNS('./lite',x')
控制台信息(nsAttr)
控制台信息(文档)
正如您所看到的,您现在可以使用您将在浏览器中使用的东西,并且由于您已经知道如何做到这一点,您的问题现在已经解决了;)


我建议直接解析DOM,而不是用正则表达式等解析字符串。如果你用谷歌搜索哪种方法更好,有很多原因。

正如@JonasW评论的那样,使用正则表达式就成功了

首先在模块顶部声明cheerio:

const cheerio = require('cheerio');
然后加载内容并解析数据:

const $ = cheerio.load(content)
content = $('pre[data-type="meta.code.data"]').text()
总之:

.pipe(tap(function(file) {
    var content = file.contents.toString(),
        relPathPrefix = path.join(path.relative(file.path, './source'));

    relPathPrefix = relPathPrefix
        .replace(new RegExp('\\' + path.sep, 'g'), '/') // Normalize path separator
        .replace(/\.\.$/, ''); // Remove trailing ..

    content = content.replace(/('|")\//g, '$1' + relPathPrefix);

    //GET ONLY JSON DATA FROM STREAM
    const $ = cheerio.load(content)
    content = $('pre[data-type="meta.code.data"]').text()

    file.contents = Buffer.from(content);
}))

听起来像是
cheerio
模块会帮助你啊,是的,听起来不错。我会试试看,谢谢@Jonas W。