Node.js 如何在nodejs中使用puppeter从表中复制文本

Node.js 如何在nodejs中使用puppeter从表中复制文本,node.js,puppeteer,Node.js,Puppeteer,我试图从HTML中提取OTP文本,因为它位于一个表行中,没有像div id或class这样的选择器。只有div样式存在。如何从中复制文本 我正在使用 下面是OTP字段的XPATH /html/body/main/div[1]/div/div[3]/div[2]/div/div[1]/div/div[2]/div[3]/div[2]/div/table/tbody/tr/td/div[2]/table/tbody/tr/td/div/table/tbody/tr/td/table/tbody/tr

我试图从HTML中提取OTP文本,因为它位于一个表行中,没有像div id或class这样的选择器。只有div样式存在。如何从中复制文本

我正在使用

下面是OTP字段的XPATH

/html/body/main/div[1]/div/div[3]/div[2]/div/div[1]/div/div[2]/div[3]/div[2]/div/table/tbody/tr/td/div[2]/table/tbody/tr/td/div/table/tbody/tr/td/table/tbody/tr[3]/td/div
这是选择器

body > main > div.container > div > div.col-sm-12.col-md-12.col-lg-12.col-xl-8 > div.tm-content > div > div.inboxWarpMain > div > div.inbox-data-content > div.inbox-data-content-intro > div:nth-child(13) > div > table > tbody > tr > td > div:nth-child(2) > table > tbody > tr > td > div > table > tbody > tr > td > table > tbody > tr:nth-child(3) > td > div

始终确保您没有违反实际刮取服务的规则。如果你使用他们的API,也许你能达到预期的效果?()

如果您确定要使用浏览器自动化并继续使用Puppeter检索一次性密码,则:您可以使用方法使用有效选择器检索任何元素的文本内容。

注意:您已经从devtools复制的内容实际上是选择器,不必包含CSS类或元素id。这是完全正确的(即使有点冗余)

例如:

233-552
const selector='body>main>div.container>div>div.col-sm-12.col-md-12.col-lg-12.col-xl-8>div.tm-content>div>div.inboxWarpMain>div>div.inbox-data-content>div.inbox-data-content-intro>div:n子项(13)>div>table>tbody>tr>td>div:n子项(2)>table>tbody>tr>td>div>table>tbody>tr>td>table>tbody>tr:n个孩子(3)>td>div'
const text=wait page.$eval(选择器,el=>el.innerText)
console.log(文本)
输出:

233-552

编辑 如果选择器将匹配多个元素,则可以使用
document.queryselect或all
类似的方法,或者选择第一个索引
[0]
上的元素

在这个确切的用例中,
$
被jQuery占用,因此它与chromeapi的
$
querySelector
的简写冲突,请参见这里:

解决方案:

233-552
const selector='body>main>div.container>div>div.col-sm-12.col-md-12.col-lg-12.col-xl-8>div.tm-content>div>div.inboxWarpMain>div>div.inbox-data-content>div.inbox-data-content-intro>div:n子项(13)>div>table>tbody>tr>td>div:n子项(2)>table>tbody>tr>td>div>table>tbody>tr>td>table>tbody>tr:n个孩子(3)>td>div'
wait page.waitFor(10000)//waitForTimeout自pptr 5.3.0以来
试一试{
等待页面。等待选择器(选择器)
const[text]=等待页面。$$eval(选择器,元素=>elements.map(el=>el.innerText))
console.log(文本)
}捕获(e){
控制台错误(e)
}
//使用page.evaluate的替代解决方案:
试一试{
const text=wait page.evaluate(el=>el.innerText,(wait page.$$(选择器))[0])
console.log(文本)
}捕获(e){
控制台错误(e)
}

始终确保您没有违反实际刮取服务的规则。如果你使用他们的API,也许你能达到预期的效果?()

如果您确定要使用浏览器自动化并继续使用Puppeter检索一次性密码,则:您可以使用方法使用有效选择器检索任何元素的文本内容。

注意:您已经从devtools复制的内容实际上是选择器,不必包含CSS类或元素id。这是完全正确的(即使有点冗余)

例如:

233-552
const selector='body>main>div.container>div>div.col-sm-12.col-md-12.col-lg-12.col-xl-8>div.tm-content>div>div.inboxWarpMain>div>div.inbox-data-content>div.inbox-data-content-intro>div:n子项(13)>div>table>tbody>tr>td>div:n子项(2)>table>tbody>tr>td>div>table>tbody>tr>td>table>tbody>tr:n个孩子(3)>td>div'
const text=wait page.$eval(选择器,el=>el.innerText)
console.log(文本)
输出:

233-552

编辑 如果选择器将匹配多个元素,则可以使用
document.queryselect或all
类似的方法,或者选择第一个索引
[0]
上的元素

在这个确切的用例中,
$
被jQuery占用,因此它与chromeapi的
$
querySelector
的简写冲突,请参见这里:

解决方案:

233-552
const selector='body>main>div.container>div>div.col-sm-12.col-md-12.col-lg-12.col-xl-8>div.tm-content>div>div.inboxWarpMain>div>div.inbox-data-content>div.inbox-data-content-intro>div:n子项(13)>div>table>tbody>tr>td>div:n子项(2)>table>tbody>tr>td>div>table>tbody>tr>td>table>tbody>tr:n个孩子(3)>td>div'
wait page.waitFor(10000)//waitForTimeout自pptr 5.3.0以来
试一试{
等待页面。等待选择器(选择器)
const[text]=等待页面。$$eval(选择器,元素=>elements.map(el=>el.innerText))
console.log(文本)
}捕获(e){
控制台错误(e)
}
//使用page.evaluate的替代解决方案:
试一试{
const text=wait page.evaluate(el=>el.innerText,(wait page.$$(选择器))[0])
console.log(文本)
}捕获(e){
控制台错误(e)
}

显示此错误,这是完整的代码。你能告诉我错误发生在哪个命令上吗?另外:能否将函数的内容包装在
try…catch
块中?我认为需要一个
页面。在
$eval
之前需要一个waitForSelector
,因为您执行的单击之后是页面上的导航。我试图运行您的代码,但在第
22
行失败:
等待el[0]。单击()由于未找到链接。也许选择器会随着时间的推移而改变,这也应该得到解决,以使其能够与自动化一起工作。嗨,我用示例站点和控制台日志更新了代码。代码停止在“复制OTP”查看我的更新Missy。
页面。$eval
不起作用:(1)它需要一个
页面。waitForSelector
,(2)使用jQuery和chrome api的页面之间存在冲突,这需要一点时间