TypeError: Невозможно прочитать свойство 'parent' из неопределенного
url = "www.w3schools.com/html/html5_video.asp"
VIDEO_LINKS = [];
VIDEO_LIST = [];
function fillVideo(callback) {
request(url, function(err, res, body) {
if (body) {
$ = cheerio.load(body);
}
links = $('source');
$(links).each(function(i, link) {
var value = $(link).attr('src');
if (value.slice(-3) == "mp4" ||
value.slice(-4) == "webm" ||
value.slice(-3) == "ogv") {
VIDEO_LINKS.push(value);
VIDEO_LIST.push($(link).text());
}
})
callback();
});
}
function writeVideo() {
for (j = 0; j < VIDEO_LIST.length; j++) {
request(VIDEO_LINKS[j]).pipe(fs.createWriteStream(VIDEO_LIST[j]));
}
}
fillVideo(writeVideo);
//www.electronicinfo.ca/printable-pdfs
PDF_LINKS = [];
PDF_LIST = [];
function fillPDF(callback) {
request(url, function(err, res, body) {
$ = cheerio.load(body);
links = $('a');
$(links).each(function(i, link) {
var value = $(link).attr('href');
if (value.slice(-3) == "pdf") {
PDF_LINKS.push(value);
PDF_LIST.push($(link).text());
}
})
callback();
});
}
function writePDF() {
for (j = 0; j < PDF_LIST.length; j++) {
request(PDF_LINKS[j]).pipe(fs.createWriteStream(PDF_LIST[j]));
}
}
fillPDF(writePDF);
Привет, это код, который работал, я буквально ничего не изменил, примерно 5 минут назад, единственное, что я изменил, это его дублирование и изменение имен переменных. Мой вопрос, как исправить этот код? Я знаю, что ошибка в том, что тело пустое, но я не знаю, как это исправить, я бы попросил любую помощь...
1 ответ
Ошибки:
- Неверный URL из-за неуказанного протокола. Я только что проверил ваш код, и
request
выдает эту ошибку:
Ошибка: неверный URI "www.w3schools.com/html/html5_video.asp".
- Ссылки извлечены из
<source>
элементы относительны. Эта ссылка поможет вам понять и решить проблему. <source>
элемент сам по себе не имеет текста. Вы должны будете использовать тот из URL, используяUrl.parse(src).pathname
,- Обработка ошибок и ошибки, связанные с некоторыми переменными: необъявленные переменные, неинициализированные переменные и глобальные переменные, которые создают глобальную область видимости и потенциально могут вызвать другие проблемы.
Fix:
Вы должны указать протокол (http
, https
,...) для URL.
Кроме того, ваш код нуждается в небольшой очистке (объявление переменных, удаление глобальных переменных, ...):
var Url = require("url");
// ...
function fillVideo(url, callback) {
request(url, function(err, res, body) {
if(err) {
return callback(err, null); // or throw an error if you like
}
var $ = cheerio.load(body),
result = [];
$('source').each(function() {
var $this = $(this),
src = $this.attr("src");
if(/(?:mp4|webm|ogv)$/i.test(src)) {
result.push({
url: Url.resolve(url, src), // make the url absolute
text: Url.parse(src).pathname
});
}
});
callback(null, result);
});
}
Тогда используйте это так:
fillVideo("http://www.w3schools.com/html/html5_video.asp", function(err, videos) {
if(err) {
console.log("Error: ", err);
return;
}
videos.forEach(function(video) {
request(video.url).pipe(fs.createWriteStream(video.text));
});
});
Замечания:
Всегда проверяйте / регистрируйте err
объект обратных вызовов. Они точно говорят, что не так с вашим кодом. В этом случае этот URI является недействительным, что на самом деле является истиной.