我尝试抓取以下无序列表:
<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
我该如何解决以使每行获得一线?
为什么不遍历每个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
}
}
这是因为您要返回一个名为result
的大对象。您还可以返回一个数组。如果这样做,它将把多个项目推到您想要的数据集中。
所以代替
return { result };
只是
return result;