CheerioJS возвращает пустые результаты, хотя элемент существует, но работает в Python - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь получить некоторые данные о ценах и весе доставки, чтобы рассчитать стоимость доставки своих товаров, в данном случае я использую 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 голосов
/ 30 октября 2018

Итак, я наконец-то обошел проблему, честно говоря, я не знаю, почему диапазон с этим идентификатором отображается в версии Python, а не в версии NodeJS, что я сделал для отладки, это выгрузил весь ответ в файл и затем найдите и посмотрите, был ли промежуток с этим конкретным идентификатором, и оказалось, что его там не было ... К счастью для меня, я нашел div с прикрепленными data атрибутами, и одним из этих атрибутов данных была цена поэтому я изменил свой селектор DOM на:

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

И теперь это работает.

...