【问题标题】:Get all unordered list elements and their text - puppeteer获取所有无序列表元素及其文本 - puppeteer
【发布时间】:2020-10-25 01:23:08
【问题描述】:

我正在尝试检索无序列表及其中的所有元素。 <ul><li> 的城市名称作为文本,我想得到这些城市。

await page
      .$eval(
        "body > div.page > div.container.account.cf > div.account-content > div.addressPage > div.addressCard.addAddressCard > div:nth-child(6) > ul",
        (ul) => {
          console.log(ul.innerHTML);
          for (let i = 0; i < ul.children.length; i++) {
            cityArray.push(ul.children[i].textContent);
          }
        }
      )
      .then((array) => console.log(array))
      .catch((err) => console.log(err));

当我尝试使用 console.log 时,什么都没有打印出来。

【问题讨论】:

    标签: javascript node.js puppeteer


    【解决方案1】:

    console.log 不起作用,因为 pageFunction 是在浏览器上下文中评估的,因此您需要注意浏览器中的控制台输出。

    作为替代方案,您可以将内部 HTML 保存在函数外部并记录它:

    const ulHtml = '';
    
    await page.$eval(
        "body > div.page > div.container.account.cf > div.account-content > div.addressPage > div.addressCard.addAddressCard > div:nth-child(6) > ul",
        (ul) => {
            ulHtml = ul.innerHTML;
        }
    );
    

    关于您的标题问题:.innerHTML 没有返回 Array[],因此您不能将其保存在这样的数组中。要获取包含每个 &lt;li&gt; 文本的数组,只需在 pageFunction 中循环它即可:

    await page.$eval(
        "body > div.page > div.container.account.cf > div.account-content > div.addressPage > div.addressCard.addAddressCard > div:nth-child(6) > ul",
        (ul) => {
            const cityArray = [];
    
            for (let i = 0; i < ul.children.length; i++) {
                cityArray.push(ul.children[i].textContent);
            }
    
            return cityArray;
        }
    ).then((cityArray) => { console.log(cityArray) });
    

    【讨论】:

    • 谢谢,这有效,这是另一个问题。城市阵列被推送后我该怎么做。我已经编辑了代码以显示承诺链接,但我收到一条错误消息,提示“未定义 cityArray”
    • 如果我的回答有帮助,请在我的回答左侧打勾。要在下一个then 中使用该数组,您需要将其返回。我已经相应地更新了我的答案。
    猜你喜欢
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 2017-11-15
    • 2015-06-21
    • 2010-12-21
    • 2021-05-12
    相关资源
    最近更新 更多