我正在编写一个脚本来打印从某个网站抓取的一些信息,我正在使用 .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/