listingData = await Promise.all(
normalizeStrings(urls).map(async (urlInput) => {
const qi = urlInput.indexOf("?");
const url = qi < 0 ? urlInput : urlInput.substring(0, qi);
const html = await fetchPage(url);
const page = parseHtml(html);
const id = url.replace("https://www.etuovi.com/kohde/", "");
const title = getRawText(page.querySelector("h1"));
const basicDetailsNodes = page.querySelector(
"#infos > div > div > div > :nth-child(2)"
).childNodes[0].childNodes;
const details = samplePage
.querySelectorAll(
"#showings > div:nth-child(2) > div:nth-child(2) > div > div > div > div > div > div > div + div"
)
.map(getRawText);
const [city, buildingType, shareType, description, type, floorString] = [
details[1],
details[2],
details[3],
details[4],
details[5],
details[8]
];
const [floor, floorMax] = floorString
? floorString.split("/").map(parseFloat).map(round)
: [1, 1];
const basicDetails = basicDetailsNodes.map(({ childNodes }) => {
return getRawText(childNodes[1].childNodes[0]);
});
const [priceString, areaString, yearString] = basicDetails;
const price = parseCurrencyString(priceString);
const area = parseAreaString(areaString);
const year = parseInt(yearString);
const taxPercentage = 0.015;
const tax = price * taxPercentage;
const areaPrice = price / area;
return {
id,
url,
title,
price,
areaPrice,
tax,
taxPercentage,
area,
year,
city,
buildingType,
shareType,
description,
type,
floor,
floorMax
};
})
)