即使该元素存在,CheerioJS仍返回空结果,但它在Python中有效

时间:2018-10-30 15:57:43

标签: javascript python node.js request cheerio

我正在尝试对价格和运输重量进行一些网页抓取,因此我可以计算商品的运输成本,在这种情况下,我使用的是Amazon。我尝试使用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吗?欢迎任何输入。

1 个答案:

答案 0 :(得分:1)

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

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

它现在可以工作。