【问题标题】:how to loop over results using cheerio如何使用cheerio循环结果
【发布时间】:2021-01-02 12:28:53
【问题描述】:

我用 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>

【问题讨论】:

    标签: node.js cheerio


    【解决方案1】:

    这个方法怎么样:找到所有.numbers,并为每个.text()返回一个对象,然后使用Cheerio的.next()返回一个包含.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 数组。

    【讨论】:

    • 非常感谢。当我尝试它时,我遇到了与以前完全相同的问题,即所有内容都在一个对象中[ { numbers: '123987456789', letters: 'ABCDEFG' } ]
    • 也许我的解释是错误的(可能)。#my-divs 实际上不是一个数组,而是一个具有多次使用 ID 的 div。所以,有 5 个 div 具有相同的 ID(不是我的设计),我只需要从其中一个 div 中获取数据。
    • 是的。您可以将相关的 HTML sn-p 添加到您的问题中吗?
    • 添加了 html。希望这就足够了吗?
    • @Waterfall 现在我明白了,花了我一点时间。再次更改答案。
    猜你喜欢
    • 2021-07-27
    • 2015-10-09
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    相关资源
    最近更新 更多