短版Jquery:$('img')[0]
不等于Cheerio:$('img')[0]
为什么?
我的目标是获取查询的第一个图像网址
我读到cheerio是一种解析html数据的好方法,就像你使用jquery一样。也许我错了,还有其他更好的东西?
我将jquery加载到我的控制台并访问https://www.google.com/search?tbm=isch&q=duck以设置我的cheerio命令。
$('div img')[2].parentNode.href
回报
我不能发布两个以上的链接,但它返回正确的链接
好,所以现在我加载节点终端并输入以下命令。
request('https://www.google.com/search?tbm=isch&q=duck', function(e,r,d){
console.log(cheerio.load(d)('div img')[2].parentNode.href)
})
回报
未定义
由于某种原因
request('https://www.google.com/search?tbm=isch&q=duck', function(e,r,d){
console.log(cheerio.load(d)('div img')[2].parentNode.attribs.href)
})
回报
这是关闭,但与我第一次在Chrome控制台上获得的不同?这是怎么回事?如何从节点获取Chrome控制台上的相同字符串?
回答您的简短版本:request()访问的html与控制台中jQuery访问的html不同。
请求获取静态html,而在浏览器中,JavaScript可以在加载脚本标记或.js文件后修改html。任何此类更改都不会出现在请求访问的html中。以您的代码为例,尝试运行类似的东西
request('https://www.google.com/search?tbm=isch&q=duck', function(e,r,d){
console.log(d);
});
并将输出保存为html文件。将此html与浏览器html进行比较。它们是不同的。特别要注意的是,图像和锚标签的属性在两者之间是不同的。
将这个逻辑应用到你的例子中,我最好的猜测是谷歌 - 出于一个目前不明显的原因 - 运行JavaScript来改变锚标签中href的值。
你需要对cheerio保持耐心,这不是像jQuery那样的大项目。
如果你正在寻找一个更好的repl我正在使用async-repl它让我做:
const request = require('request-promise')
const cheerio = require('cheerio')
let $ = cheerio.load(await request('https://www.google.com/search?tbm=isch&q=duck'))
$('div img')[2].parentNode.attribs.href
// '/url?q=https://www.exoticmeatmarkets.com/product-p/pekinduckbreastboneless16.htm&sa=U&ved=0ahUKEwjUyfOD0afdAhXUdd4KHSzPCscQwW4IGjAC&usg=AOvVaw3IeXbIkQUTpi7FsjMVCaZy'
没有等待,一切都必须发生在令人讨厌的回调中。
另外,根据您的Cookie /过去搜索,您可能会得到不同的链接。因此,请尝试与隐身窗口进行比较。