Cheerio не правильно разбирает HTML - PullRequest
0 голосов
/ 19 июня 2019

У меня есть массив строк, которые я проанализировал из таблицы из html, сохраненных в списке. Каждая из строк в списке является строкой, которая выглядит (что-то) так:

["<td headers="DOCUMENT" class="t14data"><a target="6690-Exhibit-C-20190611-1" href="http://www.fara.gov/docs/6690-Exhibit-C-20190611-1.pdf" class="doj-analytics-processed"><span style="color:blue">Click Here </span></a></td><td headers="REGISTRATIONNUMBER" class="t14data">6690</td><td headers="REGISTRANTNAME" class="t14data">SKDKnickerbocker LLC</td><td headers="DOCUMENTTYPE" class="t14data">Exhibit C</td><td headers="STAMPED/RECEIVEDDATE" class="t14data">06/11/2019</td>","<td headers="DOCUMENT" class="t14data"><a target="5334-Supplemental-Statement-20190611-30" href="http://www.fara.gov/docs/5334-Supplemental-Statement-20190611-30.pdf" class="doj-analytics-processed"><span style="color:blue">Click Here </span></a></td><td headers="REGISTRATIONNUMBER" class="t14data">5334</td><td headers="REGISTRANTNAME" class="t14data">Commonwealth of Dominica Maritime Registry, Inc.</td><td headers="DOCUMENTTYPE" class="t14data">Supplemental Statement</td><td headers="STAMPED/RECEIVEDDATE" class="t14data">06/11/2019</td>"]

Код извлекается со страницы с помощью следующей функции page.evaluate с использованием кукловода.

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

    let data = res.map((tr) => {
        let $ = cheerio.load(tr);
        const link = $("a").attr("href");
        const number = $("td[headers='REGISTRATIONNUMBER']").text();
        const name = $("td[headers='REGISTRANTNAME']").text();
        const type = $("td[headers='DOCUMENTTYPE']").text();
        const date = $("td[headers='STAMPED/RECEIVEDDATE']").text();
        return { link, number, name, type, date };
    });

По какой-то причине только тег "a" работает правильно для каждой строки. Это означает, что переменная "link" определена правильно, но ни одна из них не определена. Когда я использую $ ("*"), чтобы вернуть список того, что должно быть всеми тд, он возвращает необычный список узлов:

enter image description here

Что я делаю не так, и как я могу получить доступ к тд с различными заголовками и их текстовым содержимым? Спасибо!

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Обычно это выглядит примерно так:

let data = res.map((i, tr) => {
  const link   = $(tr).find("a").attr("href");
  const number = $(tr).find("td[headers='REGISTRATIONNUMBER']").text();
  const name   = $(tr).find("td[headers='REGISTRANTNAME']").text();
  const type   = $(tr).find("td[headers='DOCUMENTTYPE']").text();
  const date   = $(tr).find("td[headers='STAMPED/RECEIVEDDATE']").text();
  return { link, number, name, type, date };
}).get();

Имейте в виду, что у карты cheerio есть аргументы, обратные js map.

0 голосов
/ 20 июня 2019

Я нашел решение.Я просто возвращаю полный HTML через кукловода вместо того, чтобы пытаться получить отдельные строки, а затем использую приведенное выше предложение (из @pguardiario) для разбора текста:

 const res = await page.evaluate(() => {
            return document.body.innerHTML;
        });

 let $ = cheerio.load(res);
        let trs = $(".t14Standard tbody tr.highlight-row");

 let data = trs.map((i, tr) => {
        const link = $(tr).find("a").attr("href");
        const number = $(tr).find("td[headers='REGISTRATIONNUMBER']").text();
        const registrant = $(tr).find("td[headers='REGISTRANTNAME']").text();
        const type = $(tr).find("td[headers='DOCUMENTTYPE']").text();
        const date = moment($(tr).find("td[headers='STAMPED/RECEIVEDDATE']").text()).valueOf().toString();
        return { link, number, registrant, type, date };
    });
...