【问题标题】:Scraping an unordered list row per row with Cheerio in Apify在 Apify 中使用 Cheerio 每行抓取一个无序列表行
【发布时间】:2019-12-05 20:56:19
【问题描述】:

我尝试抓取以下无序列表:

<ul>
 <li class="menu-item">
  <h2 class="menu-item-title">Title</h2>
  <p class="menu-item-description">Description</p>
  <span class="menu-item-price">Price</span>
 </li>
 <li class="menu-item">
  <h2 class="menu-item-title">Title</h2>
  <p class="menu-item-description">Description</p>
  <span class="menu-item-price">Price</span>
 </li>
</ul>

我的目标是使用 Cheerio 刮板和以下代码在 Apify 中按原样抓取列表行并完全按照 HTML 表格的形式获取:

async function pageFunction(context) {
    const { $, request, log } = context;
    log.info(`URL: ${request.url}`);

    var result = [];
    var title = [];
    var description = [];
    var price = [];
    $('li.menu-item h2.menu-item-title').each(function(i, el) {
        title[i] = $(this).text().trim();
    });
    $('li.menu-item p.menu-item-description').each(function(i, el) {
        description[i] = $(this).text().trim();
    });
    $('li.menu-item span.menu-item-price').each(function(i, el) {
        price[i] = $(this).text().trim();
    });

    const numTitles = title.length;
    for (var j=0; j<numTitles; j++) {
        let obj = {
            title: title[j],
            description: description[j],
            price: price[j]
        }
        result.push(obj);
    }
    console.log('result', result);
    return {
        result
    }
}

但是,HTML 表格只显示一个超长行,而不是每行一行。

来自 console.log()

2019-12-05T19:22:14.028Z   { title: 'Rucola Parmigiano Salad',
2019-12-05T19:22:14.029Z     description: 'Rocket salad with parmesan flakes.',
2019-12-05T19:22:14.030Z     price: '€9.00' },

下面是生成的 HTML 表格:

https://api.apify.com/v2/datasets/qs66oMZsxP2RYodhn/items?format=html&clean=1

如何解决此问题以使每行有一个 ul 行?

【问题讨论】:

  • 我已经回答了这个问题,但现在我想别的了。你如何使用pageFunction()函数的结果?

标签: javascript multidimensional-array cheerio apify


【解决方案1】:

为什么不遍历每个 li 元素并将行对象直接推送到 result 数组?

async function pageFunction(context) {
    const { $, request, log } = context;
    log.info(`URL: ${request.url}`);

    var result = [];
    $('li.menu-item').each(function(i, el) {
        const $this = $(this);
        result.push({
            title: $this.find('h2.menu-item-title').first().text().trim(),
            description: $this.find('p.menu-item-description').first().text().trim(),
            price: $this.find('span.menu-item-price').first().text().trim()
        });
    });

    console.log('result', result);
    return {
        result
    }
}

【讨论】:

    【解决方案2】:

    那是因为您要返回一个名为 result 的大对象。您还可以返回一个数组。如果你这样做,它会将多个项目推送到数据集,这正是你想要的。

    所以不是

    return { result };
    

    只是

    return result;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      相关资源
      最近更新 更多