-
-
Save IvanZelenskyy/284cd77734f2f542f04acdbc4bcce1be to your computer and use it in GitHub Desktop.
| function getDocument(url){ fetch(url).then(function (response) { | |
| // The API call was successful! | |
| // console.log(response); | |
| return response.text(); | |
| }).then(function (html) { | |
| // Convert the HTML string into a document object | |
| var parser = new DOMParser(); | |
| var doc = parser.parseFromString(html, 'text/html'); | |
| if(doc.querySelector('.captcha')){ | |
| console.log("captcha",doc.querySelectorAll('.captcha')); | |
| throw "сессия протухла, надо капчу вводить ((("; | |
| } | |
| return doc; | |
| }).catch(function (err) { | |
| // There was an error | |
| console.warn('не удалось загрузить документ. Ошибка такая: ', err); | |
| throw err; | |
| })}; | |
| function isUikLevel(doc3){ | |
| if(!doc3) throw "doc3 not exists!" | |
| return doc3.querySelector('body > table:nth-child(5) > tbody > tr:nth-child(4) > td > div > table > tbody > tr > td:nth-child(2) > div > table > tbody > tr:nth-child(1) > td:nth-child(1) > nobr').innerText.includes("УИК"); | |
| } | |
| function parseDoc(doc2){ | |
| var localArr = []; | |
| console.log("doc2:", doc2); | |
| doc2.querySelectorAll("body > table:nth-child(5) > tbody > tr:nth-child(4) > td > div > table > tbody > tr > td:nth-child(2) > div > table > tbody > tr:nth-child(1) > td > nobr > a") | |
| .forEach(a=>localArr.push({'name':a.innerText, 'href':a.href})); | |
| for (var i = 1; i <=localArr.length; i++) { | |
| var s1 = "body > table:nth-child(5) > tbody > tr:nth-child(4) > td > div > table > tbody > tr > td:nth-child(2)"+ | |
| " > div > table > tbody > tr:nth-child("; | |
| var s2 = ") > td:nth-child("+i+") > nobr > b"; | |
| localArr[i-1].registered = doc2.querySelector(s1+"2"+s2).innerText; | |
| localArr[i-1].issued = doc2.querySelector(s1+"3"+s2).innerText; | |
| localArr[i-1].received = doc2.querySelector(s1+"4"+s2).innerText; | |
| localArr[i-1].invalid = doc2.querySelector(s1+"5"+s2).innerText; | |
| localArr[i-1].yes_voice = doc2.querySelector(s1+"7"+s2).innerText; | |
| localArr[i-1].no_voice = doc2.querySelector(s1+"8"+s2).innerText; | |
| } | |
| return localArr; | |
| } | |
| var regions = parseDoc(document); | |
| regions.forEach(r=>{ | |
| if(!r.tiks) r.tiks = []; | |
| if(!r.uiks) r.uiks = []; | |
| var d = getDocument(r.href); | |
| console.log("d", r.href, d); | |
| if(isUikLevel(d)){ | |
| r.uiks = r.uiks.concat(parseDoc(d, r.uiks)); | |
| } else{ | |
| r.tiks = r.tiks.concat(parseDoc(d)); | |
| tiks.forEach(t=>{ | |
| var dd = getDocument(t.href); | |
| r.uiks = r.uiks.concat(parseDoc(dd)); | |
| }) | |
| } | |
| }) | |
| console.log("RESULT!!!!", regions) |
если ты хочешь чтобы фетч возвращала значение то ты должен обернуть его в acync await, потому что он возвращает промис. тоесть все парсеры должны обрабатываться внутри фетча (если не использовать async/await)
async function getDocument(url){ fetch(url).then(function (response) {
// The API call was successful!
// console.log(response);
return response.text();
}).then(function (html) {
// Convert the HTML string into a document object
var parser = new DOMParser();
var doc = parser.parseFromString(html, 'text/html');
if(doc.querySelector('.captcha')){
console.log("captcha",doc.querySelectorAll('.captcha'));
throw "сессия протухла, надо капчу вводить (((";
}
// дождатся значения
await return doc;
}).catch(function (err) {
// There was an error
console.warn('не удалось загрузить документ. Ошибка такая: ', err);
throw err;
})};
или без async
regions.forEach((r) => {
if (!r.tiks) r.tiks = [];
if (!r.uiks) r.uiks = [];
getDocument(r.href).then
(d => {
console.log('d', r.href, d);
if (isUikLevel(d)) {
r.uiks = r.uiks.concat(parseDoc(d, r.uiks));
} else {
r.tiks = r.tiks.concat(parseDoc(d));
tiks.forEach((t) => {
var dd = getDocument(t.href);
r.uiks = r.uiks.concat(parseDoc(dd));
});
}
})
});
провереный вариант
function getDocument(url) {
return fetch(url)
.then(function (response) {
// The API call was successful!
// console.log(response);
return response.text();
})
.then(function (html) {
// Convert the HTML string into a document object
var parser = new DOMParser();
var doc = parser.parseFromString(html, 'text/html');
if (doc.querySelector('.captcha')) {
console.log('captcha', doc.querySelectorAll('.captcha'));
throw 'сессия протухла, надо капчу вводить (((';
}
console.log("doc >>>",doc);
return doc;
})
.catch(function (err) {
// There was an error
console.warn('не удалось загрузить документ. Ошибка такая: ', err);
throw err;
});
}
function isUikLevel(doc3) {
if (!doc3) throw 'doc3 not exists!';
return doc3
.querySelector(
'body > table:nth-child(5) > tbody > tr:nth-child(4) > td > div > table > tbody > tr > td:nth-child(2) > div > table > tbody > tr:nth-child(1) > td:nth-child(1) > nobr'
)
.innerText.includes('УИК');
}
function parseDoc(doc2) {
var localArr = [];
console.log('doc2:', doc2);
doc2
.querySelectorAll(
'body > table:nth-child(5) > tbody > tr:nth-child(4) > td > div > table > tbody > tr > td:nth-child(2) > div > table > tbody > tr:nth-child(1) > td > nobr > a'
)
.forEach((a) => localArr.push({ name: a.innerText, href: a.href }));
for (var i = 1; i <= localArr.length; i++) {
var s1 =
'body > table:nth-child(5) > tbody > tr:nth-child(4) > td > div > table > tbody > tr > td:nth-child(2)' +
' > div > table > tbody > tr:nth-child(';
var s2 = ') > td:nth-child(' + i + ') > nobr > b';
localArr[i - 1].registered = doc2.querySelector(s1 + '2' + s2).innerText;
localArr[i - 1].issued = doc2.querySelector(s1 + '3' + s2).innerText;
localArr[i - 1].received = doc2.querySelector(s1 + '4' + s2).innerText;
localArr[i - 1].invalid = doc2.querySelector(s1 + '5' + s2).innerText;
localArr[i - 1].yes_voice = doc2.querySelector(s1 + '7' + s2).innerText;
localArr[i - 1].no_voice = doc2.querySelector(s1 + '8' + s2).innerText;
}
return localArr;
}
var regions = parseDoc(document);
regions.forEach((r) => {
if (!r.tiks) r.tiks = [];
if (!r.uiks) r.uiks = [];
getDocument(r.href).then
(d => {
console.log('d', r.href, d);
if (isUikLevel(d)) {
r.uiks = r.uiks.concat(parseDoc(d, r.uiks));
} else {
r.tiks = r.tiks.concat(parseDoc(d));
tiks.forEach((t) => {
var dd = getDocument(t.href);
r.uiks = r.uiks.concat(parseDoc(dd));
});
}
})
});
console.log('RESULT!!!!', regions);
нужно запускать тут в консоли сайта
http://www.vybory.izbirkom.ru/region/region/izbirkom?action=show&root=1&tvd=100100163596969&vrn=100100163596966®ion=0&global=1&sub_region=0&prver=0&pronetvd=null&vibid=100100163596969&type=465