왜
StructuredDataExtractor 의 OpenGraph 경로는 가격을 product:price:amount 에서만 읽는다. 그런데 Shopify 계열 상품 페이지는 구형 OG product 네임스페이스인 og:price:amount 를 쓴다. 이름(og:title)과 이미지(og:image)는 읽히지만 가격이 null 이라 MISSING_FIELD 로 미스한다.
JSON-LD 경로도 함께 미스한다. 이 사이트들의 최상위 노드가 @type=ProductGroup 이라 isProductType 의 Product 매칭에 걸리지 않고, 실제 Product 들은 hasVariant 배열 안에 있는데 collectProductNodesInto 가 그 키를 재귀하지 않는다.
두 경로가 모두 미스해 매 요청이 Gemini fallback 으로 간다. LLM 경로는 비결정적이라 같은 사이트에서 상품명이 매번 갈린다.
prod 실측 (토너먼트 1350, postarchivefaction.com 20건): 전부 source=SERVER_LLM 이었고 이름이 두 갈래로 나왔다.
og:title 을 그대로 베낀 영어: Stream Pants (Archive) - Charcoal
- 한글 상품명에 LLM 이 번역한 색상을 붙인 것:
러너 자켓 (Archive) 차콜
한글 색상(차콜, 스노우 블랙)은 페이지에 존재하지 않는 값으로, LLM 이 영어를 번역해 만든 것이다 (본문 검색 결과 0건). 본문 DOM 의 개행이 그대로 이름에 박힌 건도 있었다: 러너 자켓 (Archive)\n \n 차콜.
무엇을
OpenGraph 경로의 가격 해석에 og:price:amount / og:price:currency 폴백을 추가한다. 표준 태그(product:price:*)를 먼저 보고, 없을 때 구형 네임스페이스를 본다. 그러면 og:title(이름) + og:price(가격)로 파서가 완결되어 이 사이트들이 결정론적 경로로 내려간다.
상품명은 og:title 을 그대로 쓴다. 색상이 포함돼 있어(Cut Out Boots (2026) - Black) 같은 상품의 다른 색상이 한 토너먼트에 올라와도 구분된다. 실제로 토너먼트 1350 에 - Black 과 - Beige 가 함께 올라와 있다.
검증한 것
- extractor 가 보내는
Accept-Language: ko,en;q=0.9 로 fetch 하면 가격이 680,000 KRW 로 정상 수신된다. 헤더가 없으면 같은 페이지가 84,100 JPY 를 내주므로, 통화 회귀 위험은 현재 헤더 설정에서 없다.
og:price:amount 는 천단위 콤마를 포함한다(680,000). 기존 parsePrice 의 PRICE_NOISE 정규식이 콤마를 제거하므로 추가 처리는 불필요하다.
- 이 사이트에는
product:price:amount 가 아예 없다. 표준 태그 우선 순서가 회귀를 만들지 않는다.
범위 밖
JSON-LD ProductGroup 인식 추가는 이 이슈에서 하지 않는다. OG 경로만으로 대상 사이트가 풀리고, ProductGroup 을 지원하면 JSON-LD 가 우선순위상 먼저 이겨 이름이 컷 아웃 부츠 처럼 색상 없는 한글로 바뀌어 색상 구분이 사라진다. 한글 표기가 필요해지면 그때 별도로 판단한다.
왜
StructuredDataExtractor의 OpenGraph 경로는 가격을product:price:amount에서만 읽는다. 그런데 Shopify 계열 상품 페이지는 구형 OG product 네임스페이스인og:price:amount를 쓴다. 이름(og:title)과 이미지(og:image)는 읽히지만 가격이 null 이라MISSING_FIELD로 미스한다.JSON-LD 경로도 함께 미스한다. 이 사이트들의 최상위 노드가
@type=ProductGroup이라isProductType의Product매칭에 걸리지 않고, 실제 Product 들은hasVariant배열 안에 있는데collectProductNodesInto가 그 키를 재귀하지 않는다.두 경로가 모두 미스해 매 요청이 Gemini fallback 으로 간다. LLM 경로는 비결정적이라 같은 사이트에서 상품명이 매번 갈린다.
prod 실측 (토너먼트 1350, postarchivefaction.com 20건): 전부
source=SERVER_LLM이었고 이름이 두 갈래로 나왔다.og:title을 그대로 베낀 영어:Stream Pants (Archive) - Charcoal러너 자켓 (Archive) 차콜한글 색상(
차콜,스노우 블랙)은 페이지에 존재하지 않는 값으로, LLM 이 영어를 번역해 만든 것이다 (본문 검색 결과 0건). 본문 DOM 의 개행이 그대로 이름에 박힌 건도 있었다:러너 자켓 (Archive)\n \n 차콜.무엇을
OpenGraph 경로의 가격 해석에
og:price:amount/og:price:currency폴백을 추가한다. 표준 태그(product:price:*)를 먼저 보고, 없을 때 구형 네임스페이스를 본다. 그러면og:title(이름) +og:price(가격)로 파서가 완결되어 이 사이트들이 결정론적 경로로 내려간다.상품명은
og:title을 그대로 쓴다. 색상이 포함돼 있어(Cut Out Boots (2026) - Black) 같은 상품의 다른 색상이 한 토너먼트에 올라와도 구분된다. 실제로 토너먼트 1350 에- Black과- Beige가 함께 올라와 있다.검증한 것
Accept-Language: ko,en;q=0.9로 fetch 하면 가격이680,000 KRW로 정상 수신된다. 헤더가 없으면 같은 페이지가84,100 JPY를 내주므로, 통화 회귀 위험은 현재 헤더 설정에서 없다.og:price:amount는 천단위 콤마를 포함한다(680,000). 기존parsePrice의PRICE_NOISE정규식이 콤마를 제거하므로 추가 처리는 불필요하다.product:price:amount가 아예 없다. 표준 태그 우선 순서가 회귀를 만들지 않는다.범위 밖
JSON-LD
ProductGroup인식 추가는 이 이슈에서 하지 않는다. OG 경로만으로 대상 사이트가 풀리고,ProductGroup을 지원하면 JSON-LD 가 우선순위상 먼저 이겨 이름이컷 아웃 부츠처럼 색상 없는 한글로 바뀌어 색상 구분이 사라진다. 한글 표기가 필요해지면 그때 별도로 판단한다.