{"record":{"id":"62aedf8243847ac3","repo":"jackwener/OpenCLI","slug":"empty-result-62aedf","errorCode":"empty_result","errorMessage":"[taxonomy=empty_result] site=${site} command=detail detail page has no readable content: ${targetUrl}","messagePattern":"\\[taxonomy=empty_result\\] site=(.+?) command=detail detail page has no readable content: (.+?)","errorType":"error_code","errorClass":"Error","httpStatus":null,"severity":"warning","filePath":"clis/jianyu/shared/procurement-detail.js","lineNumber":80,"sourceCode":"                    site,\n                    command: 'detail',\n                    detail: `detail extraction returned invalid payload: ${targetUrl}`,\n                });\n            }\n            const row = payload;\n            const title = cleanText(row.title);\n            const detailText = cleanText(row.detailText);\n            const publishTime = cleanText(row.publishTime);\n            const authGateText = cleanText(`${title} ${detailText}`);\n            if (DETAIL_AUTH_CHALLENGE_PATTERNS.some((pattern) => pattern.test(authGateText))) {\n                throw taxonomyError('selector_drift', {\n                    site,\n                    command: 'detail',\n                    detail: `detail page blocked by verification challenge: ${targetUrl}`,\n                });\n            }\n            if (!title && !detailText) {\n                throw taxonomyError('empty_result', {\n                    site,\n                    command: 'detail',\n                    detail: `detail page has no readable content: ${targetUrl}`,\n                });\n            }\n            return [\n                toProcurementDetailRecord({\n                    title: title || targetUrl,\n                    url: targetUrl,\n                    contextText: detailText,\n                    publishTime,\n                }, {\n                    site,\n                    query,\n                }),\n            ];\n        }\n        catch (error) {","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/jianyu/shared/procurement-detail.js#L62-L98","documentation":"If the extracted detail payload has neither a title nor detailText (both clean to empty), runProcurementDetail throws a taxonomy error with code 'empty_result' — the page loaded but contained no readable content matching the extractor. This is distinguished from extraction_drift: the page genuinely yielded nothing rather than an invalid payload object.","triggerScenarios":"extractDetailPayload returns a valid object but title and detailText are both empty strings for the targetUrl, on any attempt; the final attempt's error propagates.","commonSituations":"Detail page content is JS-loaded after extraction ran; the article was deleted/made private (empty shell page); region-locked or paywalled content rendering empty body; malformed URL pointing to a near-empty page.","solutions":["Re-run the detail command after increasing the post-navigation wait for JS-rendered content","Verify the URL in a normal browser; skip deleted/private/empty pages upstream","Check for regional/paywall restrictions and use an appropriate session or region","If the shell loads but content never appears, update selectors or extraction wait logic"],"exampleFix":"// before\nconst payload = await extractDetailPayload(page, url);\n// after\nawait page.waitForSelector('.detail-content', { timeout: 10000 }); // ensure content rendered\nconst payload = await extractDetailPayload(page, url);","handlingStrategy":"fallback","validationCode":"// ensure the content container exists and is non-empty before extraction\nconst text = await page.textContent('body');\nif (!text || text.trim().length < 50) throw new Error('page body is empty for ' + url);","typeGuard":"function isEmptyResultError(e) {\n  return e instanceof Error && /\\[taxonomy=empty_result\\]/.test(e.message);\n}","tryCatchPattern":"try {\n  return await runProcurementDetail(page, { site, url });\n} catch (e) {\n  if (isEmptyResultError(e)) {\n    return null; // page is genuinely empty; record and skip\n  }\n  throw e;\n}","preventionTips":["Wait for JS-rendered content before extracting","Verify URLs upstream; skip deleted/private articles","Test pages from all supported regions and sessions","Treat empty_result as data-absent, not a code bug, in alerting"],"tags":["scraping","empty-content","js-rendering"],"backgroundTag":"empty-page-content","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}