apify - Apify 网页上的产品变体
问题描述
我需要一点建议,因为我坚持使用 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'),
});
})
推荐阅读
- jquery - 将 L.motion 插件与 L.multioptionspolyline 一起使用
- vue.js - 无法从 Vue3 中的实例更新组件数据
- swift - 有没有办法使用 Apple CarPlay 获得汽车里程表的价值?
- preventdefault - $locationChangeStart 上的 PreventDefault() 停止每个重定向并且无法恢复
- javascript - 如何使用 OnClick 函数触发 Youtube API Iframe 加载器?
- angular - 如何根据对其他 formControl 值所做的更改来更新一个 formControl 的值?
- reactjs - Draft.js (react-draft-wysiwyg):编辑器组件外部的文本更新不起作用
- javascript - 没有 Internet 连接的远程生产服务器中的 JSP 脚本标记使用
- node.js - 尝试链接 Stripe 帐户,但使用实时密钥出现错误 - “您必须更新您的 Connect 品牌设置...”
- python - 如何使用循环和条件语句迭代 2 个数据帧以创建新数据帧