javascript - 如何使用 .includes() 找到数字范围内的任何数字

标签 javascript puppeteer

我正在编写一个脚本来打印从某个网站抓取的一些信息,我正在使用 .includes() 来查找并打印一个数字(如果该数字落在某个范围内)从 1,000 到 100,000,但我根本不知道该怎么做。我现在正在尝试的解决方案又长又多余,甚至不起作用。

代码

const numShare = await page.$$eval(".FormData", els =>
      els.find(e => e.textContent.includes(',000' || ',9' || ',8' || ',7' || ',6' || ',5' || ',4' || ',3' || ',2' || ',1'))
        .parentNode
        .textContent
        .trim()
    );

    return numShare;

我之前尝试过的另一件事是使用 .includes(',000'),它有效,但它只给了我严格的数字,后面有一个逗号和 3 个零。我想要的是它找到 1,000 到 100,000 之间的任何数字或格式为“x,xxx 到 xxx,xxx”的数字。这可能吗?

编辑,我正在尝试

      const shares = document.querySelector(".FormData");
      return {
        shares: shares.parentNode.nextElementSibling.nextElementSibling.textContent,
      };
    });
    
    return numShare.shares;```

最佳答案

我看不到您正在使用的页面、HTML 或文本,但我猜您有用逗号分隔数千个位置的数字。那么为什么不简单地删除这些逗号并将字符串解析为数字,然后正常比较呢?

const numShare = await page.$$eval(".FormData", els =>
  els.find(e => {
    const n = +e.textContent.trim().replace(/,/g, "");
    return n >= 1000 && n <= 100000;
  })
  .parentNode
  .textContent
  .trim()
);

可运行的 POC:

const els = [...document.querySelectorAll(".FormData")];
const result = els.find(e => {
    const n = +e.textContent.trim().replace(/,/g, "");
    return n >= 1000 && n <= 100000;
  })
  .parentNode
  .textContent
  .trim(); 
console.log(result);
<div>
  foo
  <div class="FormData">101,000</div>
</div>
<div>
  baz
  <div class="FormData">1,000</div>
</div>

另一种方法是 const n = +e.textContent.match(/\d/g).join(""); ,它会提取所有数字,并且更能容忍货币符号和空格等额外字符。

至于为什么你当前的方法不起作用,你只是问它是否包含你的巨人 || 中的第一个真实值链:

console.log(',000' || ',9' || ',8' || ',7' || ',6' || ',5' || ',4' || ',3' || ',2' || ',1');

根据评论,听起来您需要选择一个字段并测试范围。以下是适用于您提供的示例 XML 的代码:

const puppeteer = require("puppeteer"); // ^19.0.0

let browser;
(async () => {
  browser = await puppeteer.launch();
  const [page] = await browser.pages();
  const ua =
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36";
  await page.setUserAgent(ua);
  const url = "link to your XML file";
  await page.goto(url, {waitUntil: "domcontentloaded"});
  const text = await page.$eval(".SmallFormData", el =>
    el.parentNode.nextElementSibling.nextElementSibling.textContent.trim()
  );
  const n = +text.match(/\d/g).join("");
  console.log(text, n >= 1000 && n <= 100000); // => 2,275 true
})()
  .catch((err) => console.error(err))
  .finally(() => browser?.close());

这对页面结构做出了一些假设,可能不是选择 Amount 值的最可靠方法,但在没有反例的情况下,我将暂时保留其原样以避免过早优化。

关于javascript - 如何使用 .includes() 找到数字范围内的任何数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74395574/

相关文章:

javascript比较危机

javascript - Jquery幻灯片自动加载功能

javascript - 警报显示并在一段时间后消失

puppeteer - 如何从 Puppeteer 获取 java 脚本及其启动器(类似于“网络”选项卡)

puppeteer - Jasmine 使用 jest-circus 后未定义错误

javascript - Puppeteer:page.screenshot 调整视口(viewport)大小

javascript - 选择页面上新创建的元素 - puppeteer

javascript - hls.js - 如何订阅任何事件

javascript - 限制 react-dropzone 中的图像尺寸

javascript - Puppeteer:在异步函数中使用await 调用的javascript 函数中抛出自定义错误消息