Как получить value обоих td, находящихся внутри tr и (!) слить обе td в одну переменную в формате td1 : td2 ;

Имеется такой код:

<table class="tableUnder">
  <tbody>

    <tr class="local">
      <td> <a href ="/somepath/24"> Материал </td>
      <td> Оцинкованная сталь </td>
    </tr>

    <tr class="few">
      <td> <a href ="/somepath/25"> Количество комплектующих </td>
      <td> 12/6/3 </td>
    </tr>

    <tr class="local">
      <td> <a href ="/somepath/26"> Установка в подарок к покупке </td>
      <td>  </td>
    </tr>

    <tr class="few">
      <td> <a href ="/somepath/27"> Дополнительный ключ </td>
      <td>  </td>
    </tr>

  </tbody>
</table>

Нужно: забрать все характеристики из td, и сформировать их в переменную примерно таким образом:

Материал : Оцинкованная сталь ; Количество комплектующих : 12/6/3 ; Установка в подарок к покупке : есть ; Дополнительный ключ : есть ; (там, где второе значение td - пустое - нужно, чтобы прописывалось "есть" вместо пустоты)

Я пытался сделать таким образом:

unique.map(async (el, i) => {
            const content = await getHtml(el.link)

            content('table.tableUnder').each((index, element) => {

                let allTr = content(element).find('tr') 
                // const allTd = content(element).find('td') // здесь строка из td целиком
                let param = content(element).find('td')
                let propString = ""
                for (index = 0; index < param.length; index++){
                    const row = content(param[index]).find('td')
                    const name = row[0]
                    const value = row[1]
                    propString += (` ${name.children[0].data.trim()} : ${value.children[0].data.trim()} ; `)
                    el.propString = propString
                    console.log(el)
                


        
                
            })
})

Я могу получить строку, где друг за другом будут все td (const allTd = content(element).find('td')), однако мне нужно получить их в определенном виде (выше я показывал в каком виде). И я также думаю, что, чтобы получить нужные мне значения я мог бы использовать .children по индексу [0] или 1 .

Но я получаю ошибку : (node:4196) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'children' of undefined характеристика лежит в children[0].data

Как я могу получить значения td в нужном формате ? (использую node js + cheerio.)

Материал : Оцинкованная сталь ; Количество комплектующих : 12/6/3 ; Установка в подарок к покупке : есть ; Дополнительный ключ : есть ; (там, где второе значение td - пустое - нужно, чтобы прописывалось "есть" вместо пустоты)


Ответы (1 шт):

Автор решения: vsemozhebuty

Вам, случайно, не подойдёт простой объект, то есть пары ключ/значение? Вот такой:

{
  "Материал": "Оцинкованная сталь",
  "Количество комплектующих": "12/6/3",
  "Установка в подарок к покупке": "есть",
  "Дополнительный ключ": "есть"
}

Если да, можно превратить вашу таблицу в него, например, вот так:

const table = document.querySelector('table.tableUnder');

const data = Object.fromEntries(
  [...table.rows].map(row => [...row.cells].map(
    cell => cell.innerText.trim() || 'есть'
  ))
);

console.log(data);
<table class="tableUnder">
  <tbody>

    <tr class="local">
      <td> <a href ="/somepath/24"> Материал </td>
      <td> Оцинкованная сталь </td>
    </tr>

    <tr class="few">
      <td> <a href ="/somepath/25"> Количество комплектующих </td>
      <td> 12/6/3 </td>
    </tr>

    <tr class="local">
      <td> <a href ="/somepath/26"> Установка в подарок к покупке </td>
      <td>  </td>
    </tr>

    <tr class="few">
      <td> <a href ="/somepath/27"> Дополнительный ключ </td>
      <td>  </td>
    </tr>

  </tbody>
</table>

→ Ссылка