我正在从一个重复其页面上的元素的网站上收集多个innerText-Properties(24个大学资料,包括名称,平均评分,程序数量等)。
我在一家大学测试了我的小程序,使用它querySelector()
来收集我想要的4-5内文本,var u = await Promise.allSettled([arr1, arr2, arr3, arr4, arr5])
并使用它们并使用了我在顶部定义的构造函数var currUniv = new University(...myArrayOfFacts)
。到目前为止一切都很好(至少是结果...)
由于该页面一次/在一页上提供了24个大学主题(并且都具有相同的结构),因此我现在想一次querySelectorAll()
抓取5个数组,每个数组包含24个元素。如果我坚持下去,var u = await Promise.allSettled([arr1, arr2, arr3, arr4, arr5])
我最终会得到一个由5个数组组成的数组,现在不知道(而且似乎无法找到一种成功的Google方法)如何将每个数组的一个元素一次提供给构造函数。
我是否应该首先避免将所有内容塞进一个大数组中?之所以这样做,是因为我认为我需要等待所有Promises才能解决...或者应该从什么时候开始遍历数组?
一切都是异步的。我将代码缩短了一点:就像我进一步写的那样-对于一组DOM元素/对于一所大学来说,这很好用。
非常感谢您为我指明正确方向的任何提示!
const puppeteer = require('./node_modules/puppeteer');
const startUrl = "https://www.studycheck.de/hochschulen/";
//constructor - shortend
function HSMain(name, ...){
this.nameHS = name;
this...
}
const hsfPageVisits = async () => {
try{
const browser = await puppeteer.launch({headless: true});
const page = await browser.newPage();
await page.goto(startUrl, {waitUntil: 'domcontentloaded'});
// get first element (name)
var nameHS = await page.evaluate(() => {
let name = Array.from(document.querySelectorAll('div .title a')).map(node => node.innerText);
return name;
});
// get second element (rating)
var rating = await page.evaluate(() => {
let rate = Array.from(document.querySelectorAll('div .rating-container > div .rating-value')).map(node => node.innerText.trim());
return rate;
});
[...more DOM - elements...]
// wait for all promises to resolve
var univArr = await Promise.allSettled([nameHS, rating, ..., ..., ...]);
// spread the array into the object constructor
var myObj = await new HSMain(...univArr);
await browser.close();
}
catch(e){
console.log("error", e);
}
};
hsfPageVisits();
因此,您所拥有的是一系列名称,另一个用于评级等等。这些数组的每个索引都对应于同一大学,因此只有map
这些数组之一,并且使用提供的索引map
来从其余数组中获取值,不幸的是,您不能在此处使用传播语法:
let universities = nameHS.map((name, i) =>
new University(name, rating[i], theNextArray[i], theArrayAfterThat[i], ...)
);
我的方法是为每所大学一次获得所有“事实”,而不是分别按不同的阵列。每所大学都会将其事实分组在一个对象或数组中,这将大大缩短代码,如下所示:
try {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto(startUrl, { waitUntil: 'domcontentloaded' });
var universitiesFacts = await page.evaluate(() => {
let universities = Array.from(document.querySelectorAll(".institute-item")); // first get all university (each university info is contained in an element with a class 'institute-item')
return universities.map(university => [ // for each .institute-item element
university.querySelector(".title a").textContent.trim(), // get the name (using querySelector on the .institute-item element)
university.querySelector(".rating-value").textContent.trim(), // get the rating
// ... the rest of facts for the current university
]);
});
let universities = universitiesFacts.map(facts => new University(...facts)); // now we can use the spread syntax
await browser.close();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句