Как получить значение элемента itemprop с Cheerio? - PullRequest
0 голосов
/ 28 января 2020

Я впервые пытаюсь использовать библиотеку cheerio, чтобы сделать небольшую очистку веб-страниц от paginas amarillas, таких как название компании, адрес и т. Д. c ... Адрес находится в промежутке внутри промежутка без класса, только itemprop="streetAddres", я пробовал разные способы, так как это длинная строка, чтобы добраться до этого селектора, я получаю данные до того, как прямо перед itemprop, но я не знаю, как нацелить селектор itemprop, тот, который у меня есть проблема в том, что константа pathAddreses возвращает пустой массив в журнале консоли; если я удаляю последний элемент строки (itemprop='streetAddres'), он возвращает мне данные, но не совсем тот, который я хочу

Вот код:

const cheerio = require("cheerio");
const request = require("request-promise");
//const of the classes of the paginas amarillas elements we are aiming to
const pathProfesionals1 =
  ".container .row .first-content-listado .col-lg-7.col-md-8.col-xs-12 .bloque-central .central .listado-item.item-ip .box .cabecera .row .col-xs-11.comercial-nombre a h2 span";
const pathProfesionals2 =
  ".container .row .first-content-listado .col-lg-7.col-md-8.col-xs-12 .bloque-central .central .listado-item.item-ig .box .cabecera .row .col-xs-11.comercial-nombre a h2 span";
const pathTelephones1 =
  ".container .row .first-content-listado .col-lg-7.col-md-8.col-xs-12 .bloque-central .central .listado-item.item-ip .box .pie-pastilla .row .col-xs-4 a.llama-desplegable.btn.btn-amarillo.btn-block.phone.hidden.d-none span";
const pathTelephones2 =
  ".container .row .first-content-listado .col-lg-7.col-md-8.col-xs-12 .bloque-central .central .listado-item.item-ig .box .pie-pastilla .row .col-xs-4 a.llama-desplegable.btn.btn-amarillo.btn-block.phone.hidden.d-none span";
const pathAddress1 = `.container .row .first-content-listado .col-lg-7.col-md-8.col-xs-12 .bloque-central .central .listado-item.item-ig .box .row a .location span *[itemprop = 'streetAddress']`;

const pathAddress2 = "";

init = async () => {
    const arrCompanyName = [];
    const arrTelephones = [];
    const arrAddresses = [];

    const { category, city } = this.state;

    const $ = await request({
      uri: `https://www.paginasamarillas.es/search/${category}/all-ma/${city}/all-is/malaga/all-ba/all-pu/all-nc/1?what=carpintero&where=malaga&ub=false&qc=true`,
      transform: body => cheerio.load(body) //una vez hago la peticion lo paso a cheerio para que lo analice
    });

    const profesionals1 = $(pathProfesionals1).each((i, el) =>
      arrCompanyName.push($(el).text())
    );

    const telephones1 = $(pathTelephones1).each((i, el) =>
      arrTelephones.push($(el).text())
    );

    const profesionals2 = $(pathProfesionals2).each((i, el) =>
      arrCompanyName.push($(el).text())
    );

    const telephones2 = $(pathTelephones2).each((i, el) =>
      arrTelephones.push($(el).text())
    );

    const addresses1 = $(pathAddress1).each((i, el) =>
      arrAddresses.push($(el).text())
    );

    console.log(arrAddresses);
}

1 Ответ

0 голосов
/ 14 февраля 2020

Если вы хотите выбрать тег span только с атрибутом itemprop='streetAddress', вам нужно удалить * из селектора адресов. В настоящее время Cheerio пытается получить все теги с itemprop=streetAddress внутри, а не с span.

Также, если вы хотите выбрать все адреса из этого списка, вы можете запустить простой запрос с $(".listado-item .links span[itemprop='streetAddress']"), затем итерация массива объектов Cheerio.

...