【问题标题】:JavaScript Puppeteer Scraping a VariableJavaScript Puppeteer 抓取变量
【发布时间】:2023-03-16 02:40:01
【问题描述】:

我正在尝试从保存 HTML 数据的变量中抓取 HTML 数据。你可以看到我的注释,它们标有“evaluate 仅适用于不在 div 中的页面。有人能告诉我如何从包含 HTML 的变量中抓取信息吗?

是否有其他的抓取方法?

我也在forEach 循环中尝试过这个,但这导致了原始文档的第一个mealname

let mealName = htmlOfOneProduct.document.querySelector("div.meal__description-texts.js-meal-description-text > span > span").innerText;

我的带注释的代码:

const puppeteer = require('puppeteer');
function run () {
    return new Promise(async (resolve, reject) => {
        try {
            const browser = await puppeteer.launch();
            const page = await browser.newPage();
            await page.goto(" "); << Meal website
            let urls = await page.evaluate(() => {
                let results = [];
                let items = document.querySelectorAll('div.meal__wrapper'); << Gets all the meals from a page
                items.forEach((item) => {
                    let htmlOfOneProduct = item.innerHTML; << Gets the HTML of each meal

                    let mealName = htmlOfOne.evaluate(() => document.querySelector('meal-name').textContent); << Not working, should get the meal-name from the div.

                    results.push({
                        mealName: mealName
                    });
                });
                return results;
            })
            browser.close();
            return resolve(urls);
        } catch (e) {
            return reject(e);
        }
    })
}
run().then(console.log).catch(console.error);

【问题讨论】:

    标签: javascript node.js web-scraping google-chrome-devtools puppeteer


    【解决方案1】:

    您还可以组合您的 CSS 选择器并使用 Array.from() 来简化对元素的 innerText 的抓取:

    let urls = await page.evaluate(() => {
      return Array.from(document.querySelectorAll('div.meal__wrapper span.meal-name'), e => ({
        mealName: e.innerText,
      });
    });
    

    【讨论】:

      【解决方案2】:

      也许let htmlOfOneProduct = item.innerHTML; &lt;&lt; Gets the HTML of each meal没必要。

      如果你只需要某样东西的内容,你可以直接做item.innerTextitem.name 或该元素的任何其他属性。

      最终这样的事情应该是可能的:

      items.forEach((item) => {    
         let mealName = item.querySelector('meal-name').innerText
         results.push({
              mealName: mealName
         });
      });
      

      【讨论】:

      • 这成功了! " let mealName = item.querySelector('span.meal-name').innerText; "
      【解决方案3】:

      由于您没有提供网站 URL,我无法检查我的建议,抱歉。

      item.innerHTML 返回一个没有evaluate() 方法的字符串。试试这个更简单的方法:

                      items.forEach((item) => {
                          let mealName = item.querySelector('meal-name').textContent;
                          results.push({
                              mealName: mealName
                          });
                      });
      

      【讨论】:

      • 感谢您抽出宝贵时间回复。使用您的代码,节点返回以下内容:“错误:评估失败:TypeError:无法读取属性'textContent' of null”
      • 这行得通!谢谢! let mealName = item.querySelector('span.meal-name').innerText;
      猜你喜欢
      • 2011-08-07
      • 2019-11-11
      • 2021-03-20
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      相关资源
      最近更新 更多