如何使用cheerio获取所有案例的给定页面上的图像的URL

时间:2017-04-12 05:16:34

标签: html node.js url web-crawler cheerio

现在我有一个看起来像这样的函数:

static getPageImg(url) {
    return new Promise((resolve, reject) => {
        //get our html
        axios.get(url)
        .then(resp => {
            //html
            const html = resp.data;
            //load into a $
            const $ = cheerio.load(html);
            //find ourself a img
            const src = url + "/" + $("body").find("img")[0].attribs.src;
            //make sure there are no extra slashes
            resolve(src.replace(/([^:]\/)\/+/g, "$1"));
        })
        .catch(err => {
           reject(err);
        });
    });
}

这将处理页面使用相对路径链接到图像的平均情况,主机名与提供的URL相同。

然而, 大多数情况下,URL方案会更复杂,例如URL可能是stackoverflow.com/something/asdasd,我需要的是获取stackoverflow.com/someimage链接。或者更有趣的情况是使用CDN并且图像来自单独的服务器。例如,如果我想从imgur链接到某些内容,请提供如下链接:http://imgur.com/gallery/epqDj。但是图片的实际位置是http://i.imgur.com/pK0thAm.jpg网站的子域名。更有趣的是,如果我要获得src属性,我会:“//i.imgur.com/pK0thAm.jpg”。

现在我想必须有一个简单的方法来获取这个图像,因为浏览器可以非常快速,轻松地在新标签中打开“打开的窗口”,所以我想知道是否有人知道除了写作之外还有一种简单的方法可以做到这一点一个可以处理所有这些案件的大功能。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是我的功能,它最终适用于我的所有测试用例,用于构建URL类型的节点。我不得不使用解析功能。

static getPageImg(url) {
    return new Promise((resolve, reject) => {
        //get our html
        axios.get(url)
        .then(resp => {
            //html
            const html = resp.data;
            //load into a $
            const $ = cheerio.load(html);
            //find ourself a img
            const retURL = nodeURL.resolve(url,$("body").find("img")[0].attribs.src);
            resolve(retURL);
        })
        .catch(err => {
           reject(err);
        });
    });
}