TypeError: Cannot read property 'parent' of undefined

TypeError: Cannot read property 'parent' of undefined

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 分钟前开始,我几乎没有做任何更改,我唯一更改的是复制它,并更改变量名。我的问题是如何修复此代码?我知道错误是 body 是空的,但我不知道如何修复它,我希望得到任何帮助...

错误:

  1. 由于未指定协议,无效 url。我刚刚测试了你的代码,request 抛出了这个错误:

Error: Invalid URI "www.w3schools.com/html/html5_video.asp".

  1. <source> 元素中提取的链接是相对的。这将帮助您理解和解决问题。
  2. <source> 元素本身没有文本。您必须使用 Url.parse(src).pathname.
  3. 中的 url
  4. 错误处理和一些与变量相关的错误:未声明的变量、未初始化的变量和污染全局范围并可能导致其他问题的全局变量。

修复:

您应该为 url.

指定协议(httphttps、...)

此外,您的代码需要稍微清理一下(声明变量、删除全局变量……):

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));
    });
});

注:

总是check/log回调的err对象。他们准确地告诉你的代码有什么问题。在这种情况下,URI 无效,这实际上是正确的。