jackwener/OpenCLI · warning · Error
empty_result
empty_result
Error message
[taxonomy=empty_result] site=${site} command=detail detail page has no readable content: ${targetUrl} What it means
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.
Source
Thrown at clis/jianyu/shared/procurement-detail.js:80
site,
command: 'detail',
detail: `detail extraction returned invalid payload: ${targetUrl}`,
});
}
const row = payload;
const title = cleanText(row.title);
const detailText = cleanText(row.detailText);
const publishTime = cleanText(row.publishTime);
const authGateText = cleanText(`${title} ${detailText}`);
if (DETAIL_AUTH_CHALLENGE_PATTERNS.some((pattern) => pattern.test(authGateText))) {
throw taxonomyError('selector_drift', {
site,
command: 'detail',
detail: `detail page blocked by verification challenge: ${targetUrl}`,
});
}
if (!title && !detailText) {
throw taxonomyError('empty_result', {
site,
command: 'detail',
detail: `detail page has no readable content: ${targetUrl}`,
});
}
return [
toProcurementDetailRecord({
title: title || targetUrl,
url: targetUrl,
contextText: detailText,
publishTime,
}, {
site,
query,
}),
];
}
catch (error) {View on GitHub (pinned to 49907e53dc)
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
Example fix
// before
const payload = await extractDetailPayload(page, url);
// after
await page.waitForSelector('.detail-content', { timeout: 10000 }); // ensure content rendered
const payload = await extractDetailPayload(page, url); Defensive patterns
Strategy: fallback
Validate before calling
// ensure the content container exists and is non-empty before extraction
const text = await page.textContent('body');
if (!text || text.trim().length < 50) throw new Error('page body is empty for ' + url); Type guard
function isEmptyResultError(e) {
return e instanceof Error && /\[taxonomy=empty_result\]/.test(e.message);
} Try / catch
try {
return await runProcurementDetail(page, { site, url });
} catch (e) {
if (isEmptyResultError(e)) {
return null; // page is genuinely empty; record and skip
}
throw e;
} Prevention
- 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
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- LinkedIn jobs preferences could not find stable preferences
- LinkedIn services-read could not find stable Services page c
- Not a git repository
- Working tree not clean: ${status}
- 1point3acres thread
AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29).
Data as JSON: /api/errors/62aedf8243847ac3.
Report an issue: GitHub.