【问题标题】:Errors with page.$$eval() using Puppeteer使用 Puppeteer 的 page.$$eval() 错误
【发布时间】:2020-12-23 19:50:31
【问题描述】:

我正在尝试使用page.$$eval()<ul> 获取数据,将值存储在两个数组中,然后遍历数组以将数据放入键/值对中。我正在努力将数据放入数组中。

HTML 如下所示:

<ul class="b-profile__sections">
    <li class="b-profile__sections__item">
        <span class="b-profile__sections__link">
            <span class="b-profile__sections__count">585</span>
            <span class="b-profile__sections__name"> Posts </span>
        </span>
    </li>
    <li class="b-profile__sections__item">
        <span class="b-profile__sections__link m-no-hover">
            <span class="b-profile__sections__count">110.3K</span>
            <span class="b-profile__sections__name"> Likes </span>
        </span>
    </li>
</ul>

我的代码:

let user = {};
let properties = [];
let values = [];
await page.$$eval('.b-profile__sections__name', (elems, properties) => elems.forEach(elem => {
    properties.push(elem.innerText); // push result into array
}), properties) // array passed as argument to page.$$eval()
await page.$$eval('.b-profile__sections__count', (elems, values) => elems.forEach(elem => {
    values.push(elem.innerText); // push result into array
}), values) // array passed as argument to page.$$eval()
for (let i = 0; i < properties.length; i++) {
    user[properties[i]] = values[i] //iterate through arrays to make key/value pairs
}      

错误:

Error: Evaluation failed: ReferenceError: values is not defined
    at __puppeteer_evaluation_script__:2:37
    at Array.forEach (<anonymous>)
    at __puppeteer_evaluation_script__:1:19

或:

Error: Evaluation failed: TypeError: Cannot read property 'push' of undefined
    at __puppeteer_evaluation_script__:2:44
    at Array.forEach (<anonymous>)
    at __puppeteer_evaluation_script__:1:27

我猜这与浏览器(传递给page.$$eval() 的函数)/Node.js(两个数组)上下文有关。有没有更好的办法?

【问题讨论】:

  • 抱歉,Smithfield,虽然您的问题措辞得当且呈现得很好,但它提供了太多信息。你能挑出绝对最小的一段有问题的代码并展示出来吗?
  • 顺便说一句,values 将在从 Node.js 上下文传输到浏览器上下文时通过序列化/反序列化复制,因此 values.push(elem.innerText) 不会更新 Node.js 上下文中的数组。 (虽然我看不到片段中的代码如何产生上述错误。)
  • @Vaviloff 感谢您的反馈;我试图简化问题。

标签: javascript node.js puppeteer puppeteer-cluster


【解决方案1】:
let properties = await page.$$eval('.b-profile__sections__name', elems => elems.map(elem => elem.innerText));

let values = await page.$$eval('.b-profile__sections__count', elems => elems.map(elem => elem.innerText));

for (let i = 0; i < properties.length; i++) {
 user[properties[i]] = values[i]
}

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 2020-10-16
    • 2020-07-14
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多