Skip to content

Commit 73e8656

Browse files
committed
Add solution for activity 1 for lesson 3
1 parent c394ecf commit 73e8656

4 files changed

Lines changed: 792 additions & 0 deletions

File tree

Lesson03/activity_001/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
products.csv

Lesson03/activity_001/index.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
const fs = require('fs');
2+
const http = require('http');
3+
const JSDOM = require('jsdom').JSDOM;
4+
5+
function extractProducts(document) {
6+
const products = [];
7+
console.log('Parsing product data...');
8+
Array.from(document.getElementsByClassName('item'))
9+
.forEach((el) => {
10+
process.stdout.write('.');
11+
const priceAndUnitElement = el.getElementsByTagName('span')[0];
12+
const priceAndUnit = priceAndUnitElement.textContent.split("/");
13+
14+
const price = priceAndUnit[0].trim().substr(1);
15+
const unit = priceAndUnit[1].trim();
16+
17+
const name = el.getElementsByTagName('a')[0].textContent;
18+
19+
products.push({ name, price: parseFloat(price), unit });
20+
});
21+
console.log();
22+
console.log(`Found ${products.length} products.`);
23+
return products;
24+
}
25+
26+
function writeCSV(products) {
27+
const fileName = 'products.csv';
28+
29+
console.log(`Writing data to ${fileName}...`);
30+
fs.open(fileName, 'w', (error, fileDescriptor) => {
31+
if (error != null) {
32+
console.error(`Can not write to file: ${fileName}`, error);
33+
return;
34+
}
35+
36+
// Write header
37+
fs.writeSync(fileDescriptor, 'name,price,unit\n');
38+
39+
// Write content
40+
products.forEach((product) => {
41+
const line = `${product.name},${product.price},${product.unit}\n`;
42+
fs.writeSync(fileDescriptor, line);
43+
});
44+
console.log('Done.');
45+
});
46+
}
47+
48+
const page = 'http://localhost:3000';
49+
console.log(`Downloading ${page}...`);
50+
const request = http.get(page, (response) => {
51+
if (response.statusCode != 200) {
52+
console.error(`Error while fetching page ${page}: ${response.statusCode}`);
53+
console.error(`Status message: ${response.statusMessage}`);
54+
return;
55+
}
56+
57+
let content = '';
58+
response.on('data', (chunk) => content += chunk.toString());
59+
response.on('close', () => {
60+
console.log('Download finished.');
61+
const document = new JSDOM(content).window.document;
62+
writeCSV(extractProducts(document));
63+
});
64+
});
65+
66+
request.end();

0 commit comments

Comments
 (0)