Node.js Puppeteer 元数据

12
我是Puppeteer的新手,正在尝试使用Node.JS和Puppeteer从网站中提取元数据。我似乎无法正确地获取语法。下面的代码可以完美地提取Title标签,使用两种不同的方法,以及来自段落标签的文本。如何提取名称为“description”的meta数据的内容文本?例如:

meta name="description" content="Stack Overflow is the largest, etc"

我将非常感激任何建议!我似乎找不到任何例子(5个小时的搜索和代码黑客之后)。我的示例代码:
const puppeteer = require('puppeteer');

async function main() {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();
  await page.goto('https://stackoverflow.com/', {waitUntil: 'networkidle2'});

  const pageTitle1 = await page.evaluate(() => document.querySelector('title').textContent);
  const pageTitle2 = await page.title();
  const innerText = await page.evaluate(() => document.querySelector('p').innerText);
  console.log(pageTitle1);
  console.log(pageTitle2);
  console.log(innerText);
};  

main();
3个回答

25

你需要一份深入的CSS选择器教程,建议参考MDN的CSS选择器指南

我强烈推荐的一个方法是在应用自动化的页面中直接在控制台上测试你的选择器,这将节省大量运行和停止系统的时间。尝试以下操作:

document.querySelectorAll("head > meta[name='description']")[0].content;

对于使用 puppeteer,您需要复制该选择器并将其粘贴到 puppeteer 函数中,我更喜欢这种符号表示法:

现在针对 puppeteer,您需要将该选择器复制并粘贴到 puppeteer 函数中,我更喜欢这种符号表示法:

await page.$eval("head > meta[name='description']", element => element.content);

如有其他问题或疑问,请在评论中留言。


1
应该使用 element.content 而不是 element.textContent :) - Amit

1

对于那些在使用Puppeteer时遇到难题的人,这里提供了解决方案。

let dom2 = await page.evaluate(() => {
    return document.head.querySelector('meta[property="og:description"]').getAttribute("content");
});
console.log(dom2);

0

如果您愿意避免使用$eval,您可以这样做:

const descriptionTag = await page.$('meta[name="description"]');
const description = await descriptionTag?.getAttribute('content');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接