如何使用 cheerio 遍历结果

how to loop over results using cheerio

我用 python 和漂亮的汤成功地做到了这一点,但现在我想把它移植到 Node.js

我的问题是循环没有将每个项目放入数组中它自己的对象中,而是像这样将所有东西放入一个中:

[
  {
    numbers: '123987456789',
    letters: 'ABCDEFG'
  }
]

而不是:

[
  {
    numbers: '123',
    letters: 'A'
  },
  {
    numbers: '987',
    letters: 'B
  }
]

棘手的部分是 div 具有相同的 ID,因此我需要在 div 的数组中获取特定的 ID。

在 Python 中,我这样做了,然后使用 append 将项目添加到空列表中

myDivs = soup.select('#my-divs')[2]
numbers = myDivs('text.numbers')
labels = myDivs('text.labels')

Node.js

exports.scrapeData = async (req, res) => {
  const html = await Axios.get(
    "https://example.com"
  );
  const $ = await cheerio.load(html.data);
  let tests = [];
  $("#my-divs:eq(2)").each((i, elem) => {
    tests.push({
      numbers: $(elem).find("text.numbers").text(),
      labels: $(elem).find("text.labels").text(),
    });
  });

  console.log(tests);

html:

  <div id="my-divs">
      <text class="numbers">123</text>
      <text class="labels">A</text>
      <text class="numbers">987</text>
      <text class="labels">B</text>
  </div>
  <div id="my-divs">
      <text class="numbers">567</text>
      <text class="labels">C</text>
      <text class="numbers">543</text>
      <text class="labels">D</text>
  </div>

这种方法怎么样:查找所有 .numbers,并且对于每个 return 一个对象,其中包含自己的 .text() 和紧随其后的 .labels 使用Cheerio 的 .next():

exports.scrapeData = async (req, res) => {
  const html = await Axios.get("https://example.com");
  const $ = await cheerio.load(html.data);

  const tests = $("#my-divs:eq(2)").find(".numbers").map(function () {
    return {
      numbers: $(this).text().trim(),
      labels: $(this).next(".labels").text().trim(),
    }
  }).toArray();

  console.log(tests);
});

Cheerio 的 .map() 允许在上下文中使用 this,而 Cheerio 的 .toArray() 从 Cheerio 对象中提取底层 JavaScript 数组。