所以我想使用request-promise来拉取页面的主体。一旦我有了页面,我想收集所有标签并获得这些图像的src数组。假设页面上的src属性具有相对路径和绝对路径。我想要一个页面上的imgs绝对路径数组。我知道我可以使用一些字符串操作和npm路径来构建绝对路径,但我想找到一种更好的方法。
var rp = require('request-promise'),
cheerio = require('cheerio');
var options = {
uri: 'http://www.google.com',
method: 'GET',
resolveWithFullResponse: true
};
rp(options)
.then (function (response) {
$ = cheerio.load(response.body);
var relativeLinks = $("img");
relativeLinks.each( function() {
var link = $(this).attr('src');
console.log(link);
if (link.startsWith('http')){
console.log('abs');
}
else {
console.log('rel');
}
});
});
结果
/logos/doodles/2016/phoebe-snetsingers-85th-birthday-5179281716019200-hp.gif
rel
答案 0 :(得分:3)
将您的网页网址存储为变量,使用collectAsMap
将各个部分连接在一起。在Node REPL中,这适用于相对路径和绝对路径(因此“解析”):
url.resolve
您的代码将更改为:
$:~/Projects/test$ node
> var base = "https://www.google.com";
undefined
> var imageSrc = "/logos/doodles/2016/phoebe-snetsingers-85th-birthday-5179281716019200-hp.gif";
undefined
> var url = require('url');
undefined
> url.resolve(base, imageSrc);
'https://www.google.com/logos/doodles/2016/phoebe-snetsingers-85th-birthday-5179281716019200-hp.gif'
> imageSrc = base + imageSrc;
'https://www.google.com/logos/doodles/2016/phoebe-snetsingers-85th-birthday-5179281716019200-hp.gif'
> url.resolve(base, imageSrc);
'https://www.google.com/logos/doodles/2016/phoebe-snetsingers-85th-birthday-5179281716019200-hp.gif'
答案 1 :(得分:1)
要在您的方案中获取图像链接数组,您可以使用url.resolve
来解析src
标记与请求网址的相对img
属性,从而生成绝对网址。数组传递给最终then
;如果需要,你可以使用除console.log
以外的数组做其他事情。
var rp = require('request-promise'),
cheerio = require('cheerio'),
url = require('url'),
base = 'http://www.google.com';
var options = {
uri: base,
method: 'GET',
resolveWithFullResponse: true
};
rp(options)
.then (function (response) {
var $ = cheerio.load(response.body);
return $('img').map(function () {
return url.resolve(base, $(this).attr('src'));
}).toArray();
})
.then(console.log);
此url.resolve
适用于绝对或相对URL(当您从请求URL解析为相对路径时,它会解析并返回合并的绝对URL,但是当从您的请求URL解析为绝对URL时,它只会返回绝对URL)。例如,Google上的img
代码为/logos/cat.gif
,https://test.com/dog.gif
为src
属性,则会输出:
[
'http://www.google.com/logos/cat.gif',
'https://test.com/dog.gif'
]
答案 2 :(得分:0)
看起来你正在使用jQuery,所以你可以
$('img').each(function(i, e) {
console.log(e.src)
});
如果使用src
,它会将相对路径扩展为绝对路径。