Javascript 用puppeter从未知li中检索数据

Javascript 用puppeter从未知li中检索数据,javascript,puppeteer,Javascript,Puppeteer,我有几个代码块,其中我从HTML中获取的数据没有很好的数据检索结构,例如: 列表中的项目可能不总是位于同一位置。。。因此,我必须查看li>span中的数据,看看我是否在正确的位置 <div id="j-profile-header-details" class="vcard font-color-white"> <h1 class="fn n font-color-white">User Name</h1> <ul>

我有几个代码块,其中我从HTML中获取的数据没有很好的数据检索结构,例如:

列表中的项目可能不总是位于同一位置。。。因此,我必须查看
li>span
中的数据,看看我是否在正确的位置

  <div id="j-profile-header-details" class="vcard font-color-white">
    <h1 class="fn n font-color-white">User Name</h1>
    <ul>
      <li><span class="font-color-meta-light">Title</span><a href="/foobar" class="url font-color-normal">User Title</a><span class="jive-orgchart-recenter font-color-meta"><a href="/foobar" class="font-color-meta-light" title="view in orgchart"><span class="jive-icon-sml jive-glyph-orgchart"></span></a>
        </span>
      </li>
      <li><span class="font-color-meta-light">Phone Number</span>+1(555) 5555555</li>
      <li><span class="font-color-meta-light">Email</span><a href="mailto:foo@bar.com" class="font-color-normal">foo@bar.com</a></li>
      <li><span class="font-color-meta-light">Manager</span>Bar, Foo</li>
    </ul>
  </div>
这给了我一个“头域未定义”的概念。。如果我把它绑起来。。它的行为就像evaluate中的代码根本没有运行一样(甚至顶部的console.log也没有显示),并且


它(除了是一个
wait
/
async
mess)给了我
无法读取未定义的
属性“trim”的信息,如果我在
some
的第一行注销
li
。。。我得到一个ElementHandle对象。

您试图将变量(
headerDom
)从Node.js环境传递到浏览器上下文,反之亦然(
title

为此,需要将其作为参数传递,如下所示:

wait page.evaluate(元素=>{…},元素句柄);
这将把元素(句柄)从Node.js环境传递到浏览器上下文。但我不建议这样做,最好将选择器从Node.js上下文传递到脚本,然后在那里执行所有操作

此外,您不能像这样将
title
传递回Node.js脚本。将只将返回值传递回脚本。该函数在不同的执行上下文(浏览器)中运行

将所有内容合并在一起,代码可能如下所示:

const title=wait profilePage.evaluate((PROF\u PAGE\u HEADER\u DETAILS\u SELECTOR)=>{
让title=“”;
const headerDom=document.querySelector(PROF_PAGE\u HEADER\u DETAILS\u SELECTOR);
from(headerDom.querySelectorAll('li')).some(li=>{
if(li.querySelector('span').textContent.trim().toLowerCase()=“title”){
title=li.querySelector('a').textContent.trim();
返回true;
}
返回false;
})
返回标题;
},PROF_PAGE_HEADER_DETAILS_SELECTOR);

谢谢Thomas,我刚刚不得不将
document.querySelector all
更改为
querySelector
,它现在对我有效。(
querySelectorAll
返回一个
nodeList
,它没有
元素
函数,因此在
headerDom.querySelectorAll
处会失败)
  const headerDom = await profilePage.$(PROF_PAGE_HEADER_DETAILS_SELECTOR);
  let title = "";
  await profilePage.evaluate(() => {
    Array.from(headerDom.querySelectorAll('li')).some(li => {
      if (li.querySelector('span').textContent.trim().toLowerCase() === "title") {
        title = li.querySelector('a').textContent.trim();
        return true;
      }
      return false;
    })
  });
  const headerDom = await profilePage.$(PROF_PAGE_HEADER_DETAILS_SELECTOR);
  let title = "";
  (await headerDom.$$("li")).some(async li => {
    if ((await li.$eval('span', ele => ele.textContent)).trim().toLowerCase() === "title") {
      title = (await li.$eval('a.url', ele => ele.textContent)).trim();
      return true;
    }
    return false;
  });