如何使用Puppeteer选择RSS提要项目元素?



我正在尝试使用Puppeteer使用RSS提要并输出一个新提要,但是到目前为止,新提要中的每个元素的值都显示为"未定义"。起初我认为这是由于元素没有任何属性,但似乎使用querySelectorAll也未定义,当它应该抓取提要中每个项目元素的内容时。这就是我查询原始提要

的方式
await page.goto(url, {waitUntil: 'networkidle2'});
let rssitems = await page.evaluate(() => {
let results;
let items = document.querySelectorAll('item');
items.forEach((item) => {
results += '<title>' + item.querySelector('title').innerText + '</title>';
results += '<description>' + item.querySelector('description').innerText + '</description>';
results += '<link>' + item.querySelector('link').innerText + '</link>';
results += '<guid>' + item.querySelector('guid').innerText + '</guid>';
results += '<pubDate>' + item.querySelector('pubDate').innerText + '</pubDate>';
});
return results;
});

如果我理解正确,您正在尝试与RSS文档进行交互。RSS是XML,而不是HTML,因此需要Node类的API,而不是HTMLElement类的API。所以你可以试试Node.textContent,而不是HTMLElement.innerText

我最终使用了RSS解析器。这段代码使用Puppeteer截取由一个enclosure元素的url属性指定的图像的屏幕截图。这对于抓取不允许使用curl请求下载图像的站点很有用。

let Parser = require('rss-parser');
let parser = new Parser();
let rssitems = await (async () => {
let results;
let feed = await parser.parseURL(url);
feed.items.forEach(item => {
let enclurl = item.enclosure.url;
const filepath = './images/' + unique() + '.jpg';
takeScreenshot(enclurl, filepath)
.then(() => {
console.log("Screenshot taken");
})
.catch((err) => {
console.log("Error occured!");
console.dir(err);
});
results += '<title><![CDATA[' + item.title.trim()  + ']]></title>';
results += '<description><![CDATA[<img src="' + host + filepath.slice(1) + '">' + item.content.trim() + ']]></description>';
results += '<link>' + item.link.trim() + '</link>';
results += '<guid>' + item.guid.trim() + '</guid>';
results += '<pubDate>' + item.pubDate.trim() + '</pubDate>';
});
return results;
})();
async function takeScreenshot(enclurl, filepath) {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto( enclurl,{waitUntil: 'networkidle2'});
const buffer = await page.screenshot({
path: filepath
});
await page.close();
await browser.close();
}function unique() {
return 'xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx'.replace(/[x]/g, function(c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}```

最新更新