网页上的 Apify 产品变体
Apify product variants on web page
我需要一些建议,因为我一直坚持使用 Apify 抓取一个网页。我正在使用 apify/web-scraper 并且基本的抓取已经在工作(名称、描述、价格等),但是页面上有产品变体,我不知道抓取这些数据的最佳方法是什么。
产品变体形式如下所示:
<form class="qty add-to-basket add-to-basket-multi" method="post" action="">
<fieldset>
<table>
<tbody>
<tr>
<td>white</td>
<td>
<span>
<a href="" class="watch fancybox-modal">x</a>
</span>
</td>
</tr>
<tr class="alt-row">
<td>black</td>
<td>
<span class="tooltip" data-tip="6 pcs stock" data-tippos="top">
<input type="text" name="form_product_add_to_basket[count_2945]" value="0" class="count" data-id="2945" placeholder="ks" autocomplete="off" />
</span>
</td>
</tr>
<tr>
<td>green</td>
<td>
<span>
<a href="" class="watch fancybox-modal">x</a>
</span>
</td>
</tr>
</tbody>
</table>
</fieldset>
</form>
如您所见,如果产品不可用,则没有,否则有。
在输出中我想得到这样的东西(我用 XML 描述,因为稍后我需要将 Apify 的输出转换为 XML):
<variants>
<variant>
<name>white</name>
<stock>0</stock>
</variant>
<variant>
<name>black</name>
<stock>6</stock>
</variant>
<variant>
<name>green</name>
<stock>0</stock>
</variant>
</variants>
黑色变体的库存“6”来自数据提示。我认为这可以通过正则表达式获得。
我当前没有变体的代码:
async function pageFunction(context) {
const {
request,
log
} = context;
var result = [];
if (!$(".product-desc").length) {
return null;
} else {
const {
url
} = request;
const category = url.split("?category=")[1];
const title = $('.price-desc h1').text();
var description = '';
if ($('#product-desc li').text().length > 0) {
description = $('#product-desc li').text()
} else {
description = $('.desc p:last').text()
}
const price = $('.wvat span:eq(0)').text();
return {
category,
title,
description,
price
}
}
}
您可以使用 tr
作为您的项目分隔符,这样您就可以从每个 td
中提取
const variants = [];
$('tbody tr').each((_, el) => {
const $el = $(el);
variants.push({
name: $el.find('td:eq(0)').text(),
stock: parseInt($el.find('[data-tip]').attr('data-tip')) || $el.find('td:eq(1)').text().replace('x', '0'),
});
})
我需要一些建议,因为我一直坚持使用 Apify 抓取一个网页。我正在使用 apify/web-scraper 并且基本的抓取已经在工作(名称、描述、价格等),但是页面上有产品变体,我不知道抓取这些数据的最佳方法是什么。
产品变体形式如下所示:
<form class="qty add-to-basket add-to-basket-multi" method="post" action="">
<fieldset>
<table>
<tbody>
<tr>
<td>white</td>
<td>
<span>
<a href="" class="watch fancybox-modal">x</a>
</span>
</td>
</tr>
<tr class="alt-row">
<td>black</td>
<td>
<span class="tooltip" data-tip="6 pcs stock" data-tippos="top">
<input type="text" name="form_product_add_to_basket[count_2945]" value="0" class="count" data-id="2945" placeholder="ks" autocomplete="off" />
</span>
</td>
</tr>
<tr>
<td>green</td>
<td>
<span>
<a href="" class="watch fancybox-modal">x</a>
</span>
</td>
</tr>
</tbody>
</table>
</fieldset>
</form>
如您所见,如果产品不可用,则没有,否则有。
在输出中我想得到这样的东西(我用 XML 描述,因为稍后我需要将 Apify 的输出转换为 XML):
<variants>
<variant>
<name>white</name>
<stock>0</stock>
</variant>
<variant>
<name>black</name>
<stock>6</stock>
</variant>
<variant>
<name>green</name>
<stock>0</stock>
</variant>
</variants>
黑色变体的库存“6”来自数据提示。我认为这可以通过正则表达式获得。
我当前没有变体的代码:
async function pageFunction(context) {
const {
request,
log
} = context;
var result = [];
if (!$(".product-desc").length) {
return null;
} else {
const {
url
} = request;
const category = url.split("?category=")[1];
const title = $('.price-desc h1').text();
var description = '';
if ($('#product-desc li').text().length > 0) {
description = $('#product-desc li').text()
} else {
description = $('.desc p:last').text()
}
const price = $('.wvat span:eq(0)').text();
return {
category,
title,
description,
price
}
}
}
您可以使用 tr
作为您的项目分隔符,这样您就可以从每个 td
const variants = [];
$('tbody tr').each((_, el) => {
const $el = $(el);
variants.push({
name: $el.find('td:eq(0)').text(),
stock: parseInt($el.find('[data-tip]').attr('data-tip')) || $el.find('td:eq(1)').text().replace('x', '0'),
});
})