如何使用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,并针对每个 .text(),使用 Cheerio 的 .labels 返回一个包含其自己的 .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); }); 的对象:

.map()

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