Javascript 扫描网站上重复的关键字,并创建一个数组

Javascript 扫描网站上重复的关键字,并创建一个数组,javascript,puppeteer,Javascript,Puppeteer,我想扫描一个网站,过滤掉网站中最重复的关键字 例如,如果我要扫描,那么我希望有一个包含关键字的数组,如: [“衣服”、“鞋子”、“裤子”、“t恤”] 等等 我的想法是首先使用$eval()获取中的所有文本内容,并将其拆分为一个数组,然后使用.reduce()计算一个单词在网站上出现的次数并对其进行排名 这是一种方法还是有一个简单的解决方案?我认为最好的方法是使用page.evaluate(),然后在内部获取body的outerText,它将返回所有文本内容,而不包含标签和内容。之后,您可以将整个

我想扫描一个网站,过滤掉网站中最重复的关键字

例如,如果我要扫描,那么我希望有一个包含关键字的数组,如:

[“衣服”、“鞋子”、“裤子”、“t恤”]

等等

我的想法是首先使用
$eval()
获取
中的所有文本内容,并将其拆分为一个数组,然后使用
.reduce()
计算一个单词在网站上出现的次数并对其进行排名


这是一种方法还是有一个简单的解决方案?

我认为最好的方法是使用
page.evaluate()
,然后在内部获取body的
outerText
,它将返回所有文本内容,而不包含标签和内容。之后,您可以将整个文本转换为小写(使用
toLowerCase()
),并在空格、换行符或某些其他符号(如括号等)上拆分字符串。您可以使用对象来存储单词计数的键值,以保持重复单词的计数。因此,本质上,您的代码如下所示:

let data = await page.evaluate(() => {
  //acquire the text in body
  let content = document.querySelector("body").outerText;
  
  //convert text to lowercase and split on whitespaces and newlines
  let textArray = content.toLowerCase().replace(/[^A-Za-z0-9]/gm, " ").split(/\s+/gm);

  //object to map text to count
  let text_to_count_map = {};

  textArray.forEach(t => {
    if(text_to_count_map[t])
       text_to_count_map[t] ++;
    else
       text_to_count_map[t] = 1;
  });

  return text_to_count_map;
})
现在,您的
数据
变量将包含正文中每个单词的一个对象作为关键字,其对应值将是它们在正文中的频率。你可以随心所欲地使用它

编辑1

在阿迪达斯网站上对此进行了测试,能够将身体中的所有单词收集到
textArray
variable的数组中

最终编辑

使用更简单的regexp筛选不包含字母的任何内容(
[^a-Za-z0-9]


似乎效果不错。但是我得到的是
null
而不是数字。注意这里我在Node.js中使用它。您是否正在检查从
page.evaluate()
返回的
data
变量?我已经找到了它。您需要交换刚刚进行编辑的foreach循环中的
if-else
语句。我做了一个合乎逻辑的回答。我的巴迪增加了一个额外的过滤器。如果
(t.length<3),则返回
,以过滤出最多2个字符的单词