анализировать строку таблицы с помощью Cheerio

Я пытаюсь извлечь некоторые данные из таблицы с помощью cheerio. Вот упрощенная версия:

const table = `
  <table>
    <tr>
      <td></td>
      <td class="with-link"><a href="www.foo.bar"></a></td>
    </tr>
  </table>

`

const row = `<td><a href="www.foo.bar"></a></td>`

class Scraper {
  htmlToDom(html) {
    return cheerio.load(html)
  }
  findHref(row) {
    return row('a').attr('href')
  }
}

const scraper = new Scraper()
const cheerioRow = scraper.htmlToDom(row)
console.log(scraper.findHref(cheerioRow))

const cheerioTable = scraper.htmlToDom(table)
cheerioTable('tr').each(function() {
  //console.log(this)
  let td = this.find('td.with-link')
  console.log(scraper.findHref(td))

})
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <script src="https://wzrd.in/standalone/cheerio@latest"></script>
  <title>JS Bin</title>
</head>

<body>

</body>

</html>

Класс Scraper имеет два метода, один может загрузить html (строку) и вернуть объект cheerio. Другой ожидает объект (cheerio) td и возвращает от него href.

Первый журнал консоли показывает, что findHref работает должным образом. Затем я загружаю всю таблицу, просматриваю ее строки (в данном случае только одну). Внутри each цикла this должен быть объект roe (tr). Я пытаюсь найти правильную ячейку (с классом with-link) и передаю ее findHref.

Но я получаю

"TypeError: this.find не является функцией

На всякий случай вот JsBin: https://jsbin.com/vakofapiro/edit?js,console


person user3568719    schedule 13.07.2017    source источник


Ответы (1)


Вместо этого используйте cheerioTable.

`let td = cheerioTable(this).find('td.with-link').html();`

Это даст вам внутренний html td, который является href

person Rohit Sharma    schedule 13.07.2017
comment
Возможно, в этом примере это сработает, но что, если в ‹a› есть текст. Я хочу передать объект cheerio td методу findHref парсера. Это всего лишь упрощенный пример. В моем приложении метод findHref делает гораздо больше, и td также более сложен. - person user3568719; 14.07.2017