TypeError:无法读取未定义的属性“parent”

时间:2018-04-18 23:20:18

标签: javascript html node-request

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 个答案:

答案 0 :(得分:0)

错误:

  1. 由于未指定的协议,网址无效。我刚刚测试了您的代码,request正在抛出此错误:
  2.   

    错误:无效的URI&#34; www.w3schools.com/html/html5_video.asp"。

    1. <source>元素中提取的链接是相对的。这个link将帮助您理解并解决问题。
    2. <source>元素本身没有文字。您必须使用Url.parse(src).pathname
    3. 来使用网址中的那个
    4. 错误处理和一些与变量相关的错误:未声明的变量,未初始化的变量和影响全局范围的gloabal变量,可能会导致其他问题。
    5. <强>修正:

      您应该为网址指定协议(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));
          });
      });
      

      注意:

      始终检查/记录回调的err对象。他们确切地告诉你代码有什么问题。在这种情况下,URI无效,实际上是真的。