[英]How can I Get element by data attribute in string and get the inner text in a node.js application?
我是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”,我將找到值為“ 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解析器(盡管我從未嘗試在Node應用程序中使用它),但似乎有npm軟件包的工作原理基本相同。
我假設您已經將npm與Node一起使用了,所以這里是確切模塊的鏈接: https : //www.npmjs.com/package/xmldom
這是它如何運作的示例:
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)
如您所見,您現在可以使用在瀏覽器中使用的功能,並且由於您已經知道該怎么做,因此您的問題現在消失了;)
我建議直接使用regex等解析該字符串,而不是直接解析DOM。如果您用Google搜索哪種方法更好,有很多原因。
正如@JonasW指出的那樣,使用cheerio可以解決問題 。
首先在模塊頂部聲明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);
}))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.