【问题标题】:Why is cheerio not working like jquery (different results)为什么cheerio不像jquery那样工作(不同的结果)
【发布时间】:2018-09-07 08:40:50
【问题描述】:

短版 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 控制台上获得的相同字符串?

【问题讨论】:

  • 我在 chrome 控制台中获得的第一个链接(我想要的那个)是 https://www.google.com/imgres?imgurl=https%3A%2F%2Fupload.wikimedia.org%2Fwikipedia%2Fcommons%2Fthumb%2Fa%2Fa1%2FMallard2.jpg%2F1200px-Mallard2.jpg&imgrefurl=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FDuck_test&docid=CQ23FBiNB5egAM&tbnid=1yCi1lR9_ZrdEM%3A&vet=10ahUKEwjYx73treLUAhWGQCYKHW_tDVQQMwiLASgAMAA..i&w=1200&h=912&bih=792&biw=1380&q=duck&ved=0ahUKEwjYx73treLUAhWGQCYKHW_tDVQQMwiLASgAMAA&iact=mrc&uact=8
  • 未定义的是promise的返回值。

标签: jquery node.js cheerio


【解决方案1】:

回答您的简短版本:request() 访问的html 与控制台中jQuery 访问的html 不同。

request 获取静态 html,而在浏览器中,一旦加载了脚本标签或 .js 文件,JavaScript 就可以修改 html。任何此类更改都不会出现在请求访问的 html 中。以您的代码为例,尝试运行类似

request('https://www.google.com/search?tbm=isch&q=duck', function(e,r,d){
    console.log(d);
});

并将输出保存为 html 文件。将此 html 与浏览器 html 进行比较。它们不一样。特别要注意的是,图片和锚标签的属性在两者之间是不同的。

将此逻辑应用于您的示例,我最好的猜测是谷歌——出于目前对我来说不明显的原因——运行 JavaScript 来更改锚标记中 href 的值。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      • 2011-05-13
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      相关资源
      最近更新 更多