我目前正在尝试从Github的趋势页面中获取所有趋势信息库以及它们拥有的星星,并从中创建一个文本文件。网址为this
我同样使用Puppeteer。
对于存储库列表,我这样做了
const data = await page.evaluate(()=>{
const tds =Array.from(document.querySelectorAll('.explore-content ol li div h3'));
return tds.map(td => td.textContent);
});
这给了我这样的结果
The top repositories are
charlax / professional-programming
,
ssloy / tinyraytracer
,
komeiji-satori / Dress
,
ForrestKnight / open-source-cs
,
hjacobs / kubernetes-failure-stories
,
osforscience / deep-learning-ocean
,
alexkimxyz / nsfw_data_scrapper
,
kamranahmedse / developer-roadmap
,
typescript-eslint / typescript-eslint
,
Musish / Musish
,
MisterBooo / LeetCodeAnimation
,
yagiz / Bagel
,
SpaceVim / SpaceVim
,
antonmedv / fx
,
pjialin / py12306
,
braver / programmingfonts
,
macrozheng / mall
,
Snailclimb / JavaGuide
,
schollz / howmanypeoplearearound
,
flutterchina / flutter-in-action
,
flutter / flutter
,
rikschennink / shiny
,
doocs / advanced-java
,
MFatihMAR / Awesome-Game-Networking
,
go-task / task
要获得星星,我还有另一个类似的功能
const stars = await page.evaluate(()=>{
const stars = Array.from(document.querySelectorAll('.explore-content ol li div:nth-child(4) a'));
return stars.map(star=>star.textContent);
});
以这种方式输出
主要仓库
5,304
,
379
,
,,,,,,
1,173
,
44
我想将两种方法的输出合并为一个方法,以便获得结果
charlax / professional-programming有5304星。
如何合并data
和stars
方法的输出,或者如何在一个方法中进行两种不同的操作。我可以在单个map
方法内执行两个模拟操作吗?如果可以,怎么办?
答案 0 :(得分:1)
也许是更安全的方法:
display:block
答案 1 :(得分:0)
您要“压缩”两个数组的结果,然后在其上进行映射
await page.evaluate(()=>{
const repos = Array.from(document.querySelectorAll('.explore-content ol li div h3'));
const stars = Array.from(document.querySelectorAll('.explore-content ol li div:nth-child(4) a'));
// this is an array of tuples (two element arrays)
// where the first element is the name and the second is the star count
const zipped = repos.map((repoName, idx) => [repoName, stars[idx])
return zipped.map(([repoName, starCount]) => `${repoName.textContent} ${starCount.textContent}`)
});
答案 2 :(得分:0)
您可以执行以下操作。对于同一件事,您不必等待两次。
const data = await page.evaluate(()=>{
const stars = Array.from(document.querySelectorAll('.explore-content ol li div:nth-child(4) a'));
const tds =Array.from(document.querySelectorAll('.explore-content ol li div h3'));
var resArr = []
for(let i = 0; i<stars.length; i++){
resArr.push(`${tds[i].textContent} has ${stars[i].textContent}`)
}
return resArr;
}