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分钟前开始,我唯一改变的就是重复它,并更改变量名称。我的问题是如何修复此代码?我知道错误是身体是空的,但我不知道如何解决它,我会提出任何帮助......
答案 0 :(得分:0)
错误:
request
正在抛出此错误:错误:无效的URI&#34; www.w3schools.com/html/html5_video.asp"。
<source>
元素中提取的链接是相对的。这个link将帮助您理解并解决问题。<source>
元素本身没有文字。您必须使用Url.parse(src).pathname
<强>修正:强>
您应该为网址指定协议(http
,https
,...)。
此外,您的代码需要一些清理(声明变量,删除全局变量,......):
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无效,实际上是真的。