Javascript 用puppeter从未知li中检索数据
我有几个代码块,其中我从HTML中获取的数据没有很好的数据检索结构,例如: 列表中的项目可能不总是位于同一位置。。。因此,我必须查看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>
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;
});