NodeJS 如何使用cheerio循环结果

uqdfh47h  于 2023-01-04  发布在  Node.js
关注(0)|答案(2)|浏览(186)

我曾经用python和beautiful soup成功地做到了这一点,但现在我尝试将其移植到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);

网页:

<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>
yeotifhr

yeotifhr1#

这个方法怎么样:查找所有.numbers,并使用Cheerio的.next()为每个.numbers返回一个包含其自身.text()和紧随其后的.labels的对象:

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数组。

dwthyt8l

dwthyt8l2#

下面是另一种使用点差和索引配对的方法,类似于zip函数:

const cheerio = require("cheerio");

const 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>
`;
const $ = cheerio.load(html);
const numbers = [...$("#my-divs:eq(1) .labels")];
const data = [...$("#my-divs:eq(1) .numbers")].map((e, i) => ({
  numbers: $(numbers[i]).text(),
  letters: $(e).text(),
}));
console.log(data);
// => [ { numbers: 'C', letters: '567' }, { numbers: 'D', letters: '543' } ]
``

相关问题