我正在尝试对价格和运输重量进行一些网络抓取,以便计算我的商品的运费,在这种情况下我使用的是亚马逊。我尝试使用 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 上吗?欢迎任何意见。
最佳答案
所以我终于解决了这个问题,老实说,我不知道为什么具有该 id 的跨度显示在 Python 版本中而不是 NodeJS 版本中,我调试它的方法是将整个响应转储到一个文件中,然后然后搜索并查看具有该特定 ID 的跨度是否存在,结果证明它不存在......幸运的是我找到了一个带有附加 data
属性的 div,其中一个数据属性是价格,所以我将 DOM 选择器更改为:
$('#cerberus-data-metrics').data('asin-price')
现在可以使用了。
关于javascript - CheerioJS 返回空结果,即使该元素存在但它在 Python 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53068297/