javascript - Puppeteer $.eval 选择嵌套元素

标签 javascript css-selectors puppeteer apify

假设我给出的情况是这样的页面

<div id="details-container" class="style-scope ytd-channel-about-metadata-renderer">
         <yt-formatted-string class="subheadline style-scope ytd-channel-about-metadata-renderer">Details</yt-formatted-string>
        <table class="style-scope ytd-channel-about-metadata-renderer">
          <tbody class="style-scope ytd-channel-about-metadata-renderer"><tr class="style-scope ytd-channel-about-metadata-renderer">
            <td class="label style-scope ytd-channel-about-metadata-renderer">
              <yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer"></yt-formatted-string>
            </td>
            <td class="style-scope ytd-channel-about-metadata-renderer">
              <ytd-button-renderer align-by-text="" class="style-scope ytd-channel-about-metadata-renderer" button-renderer=""></ytd-button-renderer>
              <div id="captcha-container" class="style-scope ytd-channel-about-metadata-renderer"></div>
              <div id="email-container" class="style-scope ytd-channel-about-metadata-renderer"></div>
              <a id="email" target="_blank" class="style-scope ytd-channel-about-metadata-renderer" href="mailto:undefined" hidden=""></a>
            </td>
          </tr>
          <tr class="style-scope ytd-channel-about-metadata-renderer">
            <td class="label style-scope ytd-channel-about-metadata-renderer">
              <yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer"><span class="deemphasize style-scope yt-formatted-string"> Location:   </span></yt-formatted-string>
            </td>
            <td class="style-scope ytd-channel-about-metadata-renderer">
              <yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer">YourCountry</yt-formatted-string>
            </td>
          </tr>
        </tbody></table>
      </div>

假设我需要获取“YourCountry”,我如何实际获取此元素?

到目前为止我尝试过:

  const location = await page.$$eval(
    "#details-container > table > tbody:nth-child(1) > tr:nth-child(1) > yt-formatted-string",
    locationEl => locationEl.innerHTML
  );
console.log(location) // Undefined

不知道该怎么做,尝试只返回 tr 然后再次评估 tr[1] 不起作用,因为它说 tr 没有函数 .$$eval。

请注意,我正在使用 apify 来获取页面。

最佳答案

在您提供的 HTML 中,您想要的 yt-formatted-string 元素是第二个 tr< 下的第二个 td 的直接子元素,但您尝试将其与第二个 tr 的直接子级 yt-formatted-string 相匹配。您需要修复您的选择器。例如:

console.log("HTML:", document.querySelector("#details-container > table > tbody > tr:nth-child(2) > td:nth-child(2) > yt-formatted-string").innerHTML)
<div id="details-container" class="style-scope ytd-channel-about-metadata-renderer">
  <yt-formatted-string class="subheadline style-scope ytd-channel-about-metadata-renderer">Details</yt-formatted-string>
  <table class="style-scope ytd-channel-about-metadata-renderer">
    <tbody class="style-scope ytd-channel-about-metadata-renderer">
      <tr class="style-scope ytd-channel-about-metadata-renderer">
        <td class="label style-scope ytd-channel-about-metadata-renderer">
          <yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer"></yt-formatted-string>
        </td>
        <td class="style-scope ytd-channel-about-metadata-renderer">
          <ytd-button-renderer align-by-text="" class="style-scope ytd-channel-about-metadata-renderer" button-renderer=""></ytd-button-renderer>
          <div id="captcha-container" class="style-scope ytd-channel-about-metadata-renderer"></div>
          <div id="email-container" class="style-scope ytd-channel-about-metadata-renderer"></div>
          <a id="email" target="_blank" class="style-scope ytd-channel-about-metadata-renderer" href="mailto:undefined" hidden=""></a>
        </td>
      </tr>
      <tr class="style-scope ytd-channel-about-metadata-renderer">
        <td class="label style-scope ytd-channel-about-metadata-renderer">
          <yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer"><span class="deemphasize style-scope yt-formatted-string"> Location:   </span></yt-formatted-string>
        </td>
        <td class="style-scope ytd-channel-about-metadata-renderer">
          <yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer">YourCountry</yt-formatted-string>
        </td>
      </tr>
    </tbody>
  </table>
</div>

you should be able to call $$eval &c. if you have an ElementHandle 。问题是您的选择器不匹配,因此您没有选择器。

关于javascript - Puppeteer $.eval 选择嵌套元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54961336/

相关文章:

css - 将 id 选择器与其他选择器一起使用

javascript - Node.js puppeteer - 在循环中使用数组中的值来循环浏览页面

docker - 在 Docker 容器中从 Chrome-Headless 请求 webSocketDebuggerUrl

javascript - Vuejs :ajax validation error messages not displaying

javascript - 输入类型 ="file"上的点击事件触发不起作用

css - 更短的 css(手写笔)选择器

javascript - JSHandles 只能在创建它们的上下文中进行评估/找不到具有指定 ID 的上下文

javascript - 如何使用带有条件逻辑的 JavaScript Promise 并在返回之前存储到局部变量中?

javascript - 我如何使用 JavaScript 验证表单

html - 为什么类不更新ID?