Понимание объекта Cheerio и получение атрибутов - PullRequest
1 голос
/ 04 мая 2020

Я трачу так много времени, пытаясь прочитать данные из объекта, используя Cheerio, поэтому я получаю объект с:

  rp(options)
        .then(($) => {
          const listings = $('.listing-cards').first().find(".listing-link");

console.log(listings[0]; 

Это напечатает очень длинный объект, который мне нужен только первый часть:

{
    type: 'tag',
    name: 'a',
    namespace: 'http://www.w3.org/1999/xhtml',
    attribs: [Object: null prototype] {
      class: ' display-inline-block listing-link\n',
      'data-listing-id': '8026543453',
      'data-palette-listing-image': '',
     href: 'https://www...........link comes here',
     target: '_blank',
     title: 'Product title'
    },
    'x-attribsNamespace': [Object: null prototype] {
      class: undefined,
      'data-listing-id': undefined,
      'data-palette-listing-image': undefined,
      href: undefined,
      target: undefined,
      title: undefined
    },
  1. Как мне получить title и href от этого объекта?
  2. Что это за объект? это массив? какие остальные вещи внутри? (x-attribsNamespace, children, next? Они приходят с каждым объектом?

Ответы [ 3 ]

0 голосов
/ 04 мая 2020

(1) Вам следует обратиться к cheer.io документации. Вы можете попробовать

const arrayOfObject = listings.map(function(i, el) {
  // this === el
  console.log($(this).attr('href'))
  return {
    title: $(this).attr('title'),
    href: $(this).attr('href')
  };
}).get();

(2) Это представляет объект cheerio, а не простой javascript объект / массив, и да, объект cheerio имеет много свойств и функций, таких как attr

0 голосов
/ 05 мая 2020

1) Вы можете сделать:

listings[0].attribs.title
listings[0].attribs.href

Но чаще можно увидеть:

$(listings[0]).attr('title')
$(listings[0]).attr('href')

2) Это объект узла parse5, который сбивает с толку, потому что в jQuery это был бы узел DOM.

0 голосов
/ 04 мая 2020

Этот формат, в котором вы смотрите, представляет собой представление всех объектов в Javascript. См. json.

Вы можете получить доступ к любому полю в json объекте, например так:

obj.fieldname или, что эквивалентно: obj[fieldname]. Второй синтаксис полезен, если вы знаете имя поля как строку.

Итак, в вашем примере вы можете сказать:

const title = listings[0].title
const href = listings[0].attribs.href //notice there's nested json here. 'attribs' is an object itself

Что касается второй части вашего вопроса, то эти поля не поставляются с каждым javascript объектом. Вы можете легко создать объект без этих полей:

const obj = {
    myOnlyField: "Hello, world."
}

Вы, возможно, можете прочитать документацию cheerio, чтобы узнать, всегда ли их библиотека включает эти поля.

...