Как исправить селектор в Apify для получения данных из ссылки данных JSON?

Я использую Apify для получения данных из ссылок на файлы json. Вот данные json:

<html>
    <body>
        <pre>
            {"exhibitor-single":[{"firstname":"Ines","lastname":"Konwiarz","email":"[email protected]"}]}
        </pre>
    </body>
</html>

Итак, я использовал следующий код в задаче apify webscraper.

async function pageFunction(context) {
    const request = context.request;
    const $ = context.jQuery;

   var data =  $('body > pre').html();
   var items = JSON.parse(data);

       return {
        Url: request.url,
        Last_Name: items[`exhibitor-single`].lastname,
        First_Name: items[`exhibitor-single`].firstname,
        Email: items[`exhibitor-single`].email

        };
}

Переменная data имеет правильный селектор CSS для данных json. Но он не возвращает никаких данных. Может ли кто-нибудь помочь мне найти, что здесь пошло не так? Заранее спасибо.


person neenkart    schedule 22.12.2019    source источник
comment
Добро пожаловать в Stack Overflow. Переменная data будет содержать HTML-содержимое элемента pre непосредственно под элементом body. Предоставьте минимальный воспроизводимый пример: stackoverflow.com/help/minimal-reproducible-example   -  person Twisty    schedule 23.12.2019
comment
Я отредактировал детали, и, если хотите, могу поделиться URL-адресом.   -  person neenkart    schedule 23.12.2019


Ответы (1)


Судя по структуре pageFunction, я предполагаю, что вы используете apify / web-scraper.

Если вы хотите получать только данные из ссылок JSON, вы можете легко использовать apify / cheerio-scraper. Это будет стоить намного меньше вычислительной мощности, поскольку вам не нужно открывать весь браузер.

Для получения данных JSON вам необходимо использовать настройку pageFunction в cheerio scraper: pageFunction:

async function pageFunction(context) {
    const { request ,json } = context;
    const items =  json;
    return {
        Url: request.url,
        Last_Name: items.lastname,
        First_Name: items[`exhibitor-single`].firstname,
        Email: items.email
    };
}

Cheerio scraper по умолчанию поддерживает только HTML-ответ, вам необходимо обновить Дополнительные типы mime в расширенных конфигурациях со значением:

[
  "application/json"
]
person drobnikj    schedule 23.12.2019
comment
Спасибо за ответ, но он тоже не вернул никаких данных. - person neenkart; 23.12.2019
comment
Я протестировал его на своем ответе JSON, и он работает. Можете ли вы предоставить свой URL-адрес в формате JSON, и я протестирую его там? - person drobnikj; 30.12.2019