首页 > 解决方案 > 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
        }
    }
}

标签: apify

解决方案


您可以将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'),
  });
})

推荐阅读