NodeJS Cheerio无法按ID找到表

ijxebb2r  于 2023-01-08  发布在  Node.js
关注(0)|答案(1)|浏览(139)

我试图从https://www.baseball-reference.com/players/p/pujolal01.shtml中获取球员统计信息,特别是从标准击球和球员值-击球表中获取。

const page = cheerio.load(response.data);
const statsTable = page('#batting_standard');
const rows = statsTable.find('tbody > tr').not('.minors_table').add(statsTable.find('tfoot > tr:first'));
const moreStatsTable = page('#batting_value');
const moreRows = moreStatsTable.find('tbody > tr, tfoot > tr:first');

由于某种原因,它能够检索第一个表(id = 'batting_standard'),但不能检索第二个表(id = 'batting_value'),比如moreStatsTable = null。这是怎么回事?我不明白为什么cheerio找不到值表,因为它有一个唯一的id。是不是只有我有这个问题?

pw9qyyiw

pw9qyyiw1#

展开chitown88的评论,你想要的数据看起来就在评论里面,网站在页面加载后使用JS来显示这些评论的HTML。
Cheerio GitHub issue #423提供了一种从评论中识别和提取数据的方法,我将其应用于您的用例,以查找您想要的特定表格:

const cheerio = require("cheerio"); // 1.0.0-rc.12

const url = "https://www.baseball-reference.com/players/p/pujolal01.shtml";

fetch(url) // Node 18 or install node-fetch, or use another library like axios
  .then(res => {
    if (!res.ok) {
      throw Error(res.statusText);
    }

    return res.text();
  })
  .then(html => {
    const $ = cheerio.load(html);

    $("*").map((i, el) => {
      $(el).contents().map((i, el) => {
        if (el.type === "comment") {
          const $ = cheerio.load(el.data);
          const table = $("#batting_value").first();

          if (table.length) {
            const data = [...table.find("tr")].map(e =>
              [...$(e).find("td, th")].map(e => $(e).text().trim())
            );
            // trim the table a bit for display
            console.table(data.slice(0, 4).map(e => e.slice(0, 4)));
          }
        }
      });
    });
  });

输出:

┌─────────┬────────┬───────┬───────┬──────┐
│ (index) │   0    │   1   │   2   │  3   │
├─────────┼────────┼───────┼───────┼──────┤
│    0    │ 'Year' │ 'Age' │ 'Tm'  │ 'Lg' │
│    1    │ '2001' │ '21'  │ 'STL' │ 'NL' │
│    2    │ '2002' │ '22'  │ 'STL' │ 'NL' │
│    3    │ '2003' │ '23'  │ 'STL' │ 'NL' │
└─────────┴────────┴───────┴───────┴──────┘

相关问题