【问题标题】:Why are some images' height/width undefined?为什么有些图像的高度/宽度未定义?
【发布时间】:2018-02-26 23:22:53
【问题描述】:

我目前正在尝试抓取网站的图像大小。我正在使用一个名为 scraperjs 的模块,它通常对我有帮助。现在我正在获取所有图像及其属性,但由于其中一些没有指定的高度/宽度,因此返回值是“未定义”。如果他们有一个高度/宽度属性,它就像一个魅力。即使没有在属性中说明它们的测量值,我如何才能获得它们的高度/宽度。 在此先感谢,这是我的代码。

var scraperjs = require('scraperjs');
url = process.argv.slice(2)[0];

if (!url) {
console.log('Usage: node ImgSizeGetter.js <url>');
return;
}

/*
 Get all the Imagessizes in a page.
 */
scraperjs.StaticScraper
.create()
.onStatusCode(function (code) {
//console.log(code);
})
    .scrape(function ($) {
/*return all img tags from entered url*/
return $('img').map(function () {
    /*read the height and width attr of each img returned*/
    var height = $(this).attr('height'),
        width = $(this).attr('width'),
        size = height + "x" + width;
    console.log(size);
    /*return size for further handling*/
    return size;
}).get();
})
    .then(function (images) {
/*do stuff*/
})
.get(url);

这是调用模块后我的节点命令提示符的粘贴:

node ImgSizeGetter.js https://reddit.com
70x70
52x70
70x70
62x70
36x70
70x70
52x70
69x70
70x70
69x70
70x70
59x70
69x70
52x70
70x70
52x70
39x70
52x70
67x70
39x70
70x70
52x70
68x70
39x70
undefinedxundefined

注意如果 undefinedxundefined 的最后一个尺寸,在查看 html 源代码后发现这是唯一没有设置高度/宽度属性的。

【问题讨论】:

  • 如果&lt;img&gt; 没有“height”和“width”属性,则不会有值。您明确要求 jQuery 获取 attributes 的值,而不是直接查看 DOM 节点的 properties。将.attr() 切换为.prop()
  • 可能是cheerio 而不是JQuery
  • @codtex 好吧,如果它真的是“核心 jQuery 的实现”,那也是一样。
  • 我试过你的答案,实际上它似乎无法识别 .prop 函数。可能是因为它的欢呼声,就像@codtex 所说的那样。
  • .prop 遗憾地没有解决问题,我仍然得到 undefinedxundefined 作为返回值。

标签: javascript jquery html node.js image


【解决方案1】:

reddit 主页上的最后一个&lt;img&gt; 标记没有明确具有任何高度或宽度属性。这是一个一像素一像素的透明图像。

$().attr() 所做的是寻找实际设置的属性而不是属性。属性是实际写入 HTML 文件的内容,属性是属性和浏览器默认值的混合。属性可以随时间变化(例如通过脚本),而属性保持不变。

如果你想获取图片的实际高度和宽度,请使用 jQueries $().prop("height")$().prop("width") 函数。

在您的代码中如下所示:

return $('img').map(function () {
    /*read the height and width prop of each img returned*/
    var height = $(this).prop('height'),
        width = $(this).prop('width'),
        size = height + "x" + width;
    console.log(size);
    /*return size for further handling*/
    return size;
}).get();

这将返回以下内容:

0: "70x70"
1: "52x70"
2: "70x70"
3: "70x70"
4: "70x70"
5: "62x70"
6: "36x70"
7: "52x70"
8: "69x70"
9: "70x70"
10: "52x70"
11: "69x70"
12: "70x70"
13: "39x70"
14: "70x70"
15: "67x70"
16: "69x70"
17: "52x70"
18: "70x70"
19: "39x70"
20: "52x70"
21: "39x70"
22: "70x70"
23: "52x70"
24: "1x1"

【讨论】:

  • 感谢您的快速回答,完全有道理!在尝试了您的代码示例后,我遇到了这样的错误:TypeError: $(...).prop is not a function。这实际上可能是由于它的 Cheerio 而不是 JQuery(由上面的另一个答案说明)
  • 嗯,是的,这可能是一件事,你把它标记为 jQuery,这就是我回答它的原因 jQuery ^^
  • 看起来cheerio基本上是核心jQuery,scraperjs框架都被列为依赖于他们的git,所以它实际上应该是可能的吧?
  • Cheerio 将 .prop() 列为可行的方法:github.com/cheeriojs/cheerio#prop-name-value-
  • 确实如此。如果它只接收一个 jQuery,.prop 应该是可能的。还有为什么 .attr 可以工作,但 .prop 不行。我迷路了。
猜你喜欢
  • 2017-08-10
  • 1970-01-01
  • 2015-07-02
  • 2012-10-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2011-05-02
  • 1970-01-01
相关资源
最近更新 更多