【问题标题】:CheerioJS returns empty results even though the element exists but it works in Python即使元素存在,CheerioJS 也会返回空结果,但它在 Python 中有效
【发布时间】:2018-10-30 15:57:42
【问题描述】:

我正在尝试对价格和运输重量进行一些网络抓取,以便计算我的物品的运输成本,在这种情况下我使用的是亚马逊。我尝试使用 NodeJS 并创建一个 API,以便我可以将它与前端连接以方便使用,但不知何故,它不会返回元素,即使元素明显存在,它也可以在 Python 中正常工作见下文...

这是我的 NodeJS 代码,为了这个问题,我将 AMD Ryzen 的链接作为 URL:

const cheerio = require('cheerio');
const request = require('request');

const url = `https://www.amazon.com/AMD-Ryzen-Processor-Wraith-Cooler/dp/B07B428M7F/ref/=sr_1_2/?ie\=UTF8\&qid\=1540883858\&sr\=8-2\&keywords\=amd`;

request(url, (error, response, body) => {
  if(error) console.log(error);
  let $ = cheerio.load(body);
  console.log($('#priceblock_ourprice').text()); // Returns an empty line, even though it works in Python.
});

这是我的 Python 代码:

import requests, urllib, sys
from pyquery import PyQuery as pq

d = pq(url="https://www.amazon.com/AMD-Ryzen-Processor-Wraith-Cooler/dp/B07B428M7F/ref/=sr_1_2/?ie\=UTF8\&qid\=1540883858\&sr\=8-2\&keywords\=amd")

print(d('#priceblock_ourprice').text()) # Returns $309.89 as expected.

它使用相同的 URL,但仍按预期返回元素,我什至尝试为 NodeJS 使用不同的请求模块,结果仍然相同,可能是 Cheerio 的问题吗?欢迎任何意见。

【问题讨论】:

  • 如果你 console.log(body) 怎么办?
  • 并尝试 console.log(response) 也可能存在
  • 将它们记录到控制台有效,它返回整个页面,但使用 ID 选择项目不起作用。

标签: javascript python node.js request cheerio


【解决方案1】:

所以我终于解决了这个问题,老实说,我不知道为什么带有该 ID 的跨度显示在 Python 版本中而不是在 NodeJS 版本中,我所做的调试是将整个响应转储到一个文件和然后搜索并查看具有该特定 ID 的跨度是否存在,结果发现它不存在...幸运的是我找到了一个带有 data 属性的 div,其中一个数据属性是价格,所以我将 DOM 选择器更改为:

$('#cerberus-data-metrics').data('asin-price')

现在可以使用了。

【讨论】:

  • 这并不让我感到惊讶,您可以期望亚马逊会根据标头、cookie、地理位置等发送不同的响应。
  • @pguardiario 是的,确实如此,但在某些时候它应该保持不变或至少与任一版本同步,我仍然不明白为什么 Python 版本有效,而不是 NodeJS 版本。跨度>
  • 亚马逊为您提供了该页面的 2 个不同版本,因为您的标题不同。
  • @pguardiario 关于如何发送相同标题的任何想法?
  • 是的,您可以在 httpbin.org/headers 上查看标头并转到请求 github 页面以获取有关设置这些标头的文档。如果是我,我会使用 axios。
猜你喜欢
  • 2018-11-24
  • 2023-04-05
  • 2011-07-19
  • 2020-06-16
  • 2021-05-26
  • 2014-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多