【问题标题】:TypeError: Cannot read property 'parent' of undefinedTypeError:无法读取未定义的属性“父级”
【发布时间】:2018-09-29 07:51:44
【问题描述】:

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 是空的,但我不知道如何解决它,我会寻求任何帮助...

【问题讨论】:

  • 我几乎没有改变任何东西 .... 我唯一改变的东西...(脖子上的快速矛盾在那里...)跨度>
  • 哪个在工作,第一个还是第二个?
  • 另外:if (body) { $ = cheerio.load(body); } 似乎是错误的。如果body 是假的怎么办?您只需使用 $ 尽管它没有分配任何东西。
  • 它曾经是 PDF 之一(秒),但现在都不起作用!
  • 只需删除if 检查。如果body 为空,则$ 将不匹配任何内容。

标签: javascript html node-request


【解决方案1】:

错误:

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

错误: URI“www.w3schools.com/html/html5_video.asp”无效。

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

修复:

您应该为 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));
    });
});

注意:

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

【讨论】:

  • 感谢您的快速回复,但我的代码到底有什么问题?
  • 另外,你的代码看起来更复杂,然后是我的代码,没有冒犯,我似乎更喜欢我的代码......
  • 如果您运行我的代码,那么这应该可以工作(最初我使用它并且它有效,) www.electronicinfo.ca/printable-pdfs (这不适用于程序,因为错误的扩展名,但是它应该可以正确编译)
  • www.pubcom.com/PDF-test_1.html(此链接第一次有效,但第二次无效)
  • @ ibrahim mahrir 我意识到我的 URI 无效,但它是有效的,我不明白为什么?是不是有原因,一个url可以用一次,但是下次用就失效了
猜你喜欢
  • 2015-03-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2019-08-19
相关资源
最近更新 更多