o2o-negosium-original/lps/services/search/coupang/selectors.py
민헌 61bc719e28 feat(lps): 배송비 유형 분류 — 쿠팡 배송신호 파싱 + 네이버 배송비제외 명시
NormalizedProduct 에 shipping_type(rocket|rocket_merchant|free|paid|None) 추가.
쿠팡 파서: 로켓 뱃지(img src)로 유형, '무료배송'/'배송비 X원' 텍스트로 금액 판별
(상품명 '무료배송' 오탐은 이름 제거 후 매칭). 네이버 lprice 는 배송비 제외
상품가라 배송 필드 None — 카탈로그 '배송비포함 최저가'와 다른 이유를 docs/api.md 에 명시.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 13:59:28 +09:00

26 lines
1.1 KiB
Python

"""쿠팡 검색결과 셀렉터(외부화).
쿠팡 클래스는 webpack 해시 suffix(예: ProductUnit_productUnit__Qd6sv)를 달고 있어
배포마다 suffix 가 바뀐다. 따라서 접두 부분 매칭([class*=...])으로 견고성을 확보한다.
레이아웃이 바뀌면 이 파일만 고치면 되도록 파서에서 분리한다(new.md: 셀렉터 외부 설정).
"""
from dataclasses import dataclass
@dataclass(frozen=True)
class CoupangSelectors:
card: str = "li[class*=ProductUnit_productUnit]"
name: str = "[class*=ProductUnit_productNameV2]"
price_area: str = "[class*=PriceArea_priceArea]"
orig_price: str = "del" # price_area 내부: 정가(취소선)
link: str = "a[href]"
image: str = "figure img"
data_id_attr: str = "data-id" # li 의 vendorItemId
# 배송 뱃지: 로고 이미지 src 로 판별(배송 텍스트는 해시 없는 인라인 스타일 span 이라 텍스트 매칭).
rocket_badge: str = "img[src*=rocket]"
rocket_merchant_marker: str = "rocket_merchant" # src 에 포함 시 판매자로켓, 그 외 rocket* 는 로켓배송
SELECTORS = CoupangSelectors()