Add Magento price selector support

- Added data-price-amount selector (Magento 2 stores numeric price here)
- Added .price-wrapper, .price-box, .special-price selectors
- Extract price directly from data-price-amount attribute
- Detect currency from surrounding text when using numeric attribute
- Fixes CHF price extraction from Magento/Degussa gold shop

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
clucraft 2026-01-23 13:35:48 -05:00
parent 925ff1cb27
commit 5a682276b6

View file

@ -686,8 +686,12 @@ const siteScrapers: SiteScraper[] = [
// Generic selectors as fallback
const genericPriceSelectors = [
'[itemprop="price"]',
'[data-price-amount]', // Magento 2
'[data-price]',
'[data-product-price]',
'.price-wrapper [data-price-amount]', // Magento 2 price wrapper
'.price-box .price', // Magento price box
'.special-price .price', // Magento special/sale price
'.price',
'.product-price',
'.current-price',
@ -1074,8 +1078,28 @@ function extractGenericPrice($: CheerioAPI): ParsedPrice | null {
return;
}
const text = $el.attr('content') || $el.attr('data-price') || $el.text();
const parsed = parsePrice(text);
// Check various attributes where price might be stored
const priceAmount = $el.attr('data-price-amount'); // Magento 2
const dataPrice = $el.attr('data-price');
const content = $el.attr('content');
const text = $el.text();
// Try data-price-amount first (Magento stores numeric value here)
if (priceAmount) {
const price = parseFloat(priceAmount);
if (!isNaN(price) && price > 0) {
// Try to detect currency from nearby elements or default to USD
const currencyEl = $el.closest('.price-box').find('[data-price-type]').first();
const priceText = currencyEl.length ? currencyEl.text() : text;
const currencyMatch = priceText.match(/([A-Z]{3}|[$€£¥₹])/);
const currency = currencyMatch ? (currencyMatch[1] === '$' ? 'USD' : currencyMatch[1] === '€' ? 'EUR' : currencyMatch[1] === '£' ? 'GBP' : currencyMatch[1]) : 'USD';
prices.push({ price, currency });
return;
}
}
const priceStr = content || dataPrice || text;
const parsed = parsePrice(priceStr);
if (parsed && parsed.price > 0) {
prices.push(parsed);
}