为什么cheerio不像jquery那样工作(结果不同)

问题描述 投票:1回答:2

短版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)
})

回报

/ URL Q = http://kids.nationalgeographic.com/animals/mallard-duck/&sa=U&ved=0ahUKEwiPg6mE0uLUAhVD7CYKHeE9AjsQwW4IGjAC&usg=AFQjCNFBS5_1fn3v4e10lDuHmDYBvP4DSg

这是关闭,但与我第一次在Chrome控制台上获得的不同?这是怎么回事?如何从节点获取Chrome控制台上的相同字符串?

jquery node.js cheerio
2个回答
0
投票

回答您的简短版本: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的值。


0
投票

你需要对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 /过去搜索,您可能会得到不同的链接。因此,请尝试与隐身窗口进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.