DIYgod/RSSHub · error · Error
No articles found.
Error message
No articles found.
What it means
Thrown by the Cline blog route when `extractArticlesFromDOM($)` returns an empty array after loading `${rootUrl}/blog/archive`. This is a defensive guard against a silent empty feed — it signals that the DOM selectors no longer match Cline's archive markup. Plain `Error`.
Source
Thrown at lib/routes/cline/blog.ts:57
: null;
})
.filter(Boolean) as DataItem[];
}
async function handler() {
// Use the archive page which has all articles
const archiveUrl = `${rootUrl}/blog/archive`;
const response = await got({
method: 'get',
url: archiveUrl,
});
const $ = load(response.data);
const articles = extractArticlesFromDOM($);
if (articles.length === 0) {
throw new Error('No articles found.');
}
return {
title: 'Cline Official Blog',
link: blogUrl,
item: articles,
description: 'Cline Official Blog - AI Coding Assistant',
language: 'en' as const,
};
}
export const route: Route = {
path: '/blog',
categories: ['blog'],
example: '/cline/blog',
parameters: {},
features: {
requireConfig: false,View on GitHub (pinned to bed535e087)
Solutions
- Open `https://cline.com/blog/archive` (or whatever rootUrl resolves to) and inspect the article card markup.
- Update the selectors inside `extractArticlesFromDOM` to match the new class names / structure.
- Check the HTTP status and body returned by `got` — if it is a challenge page, add headers (User-Agent via `config.trueUA`) or switch to Puppeteer.
Defensive patterns
Strategy: retry
Type guard
function hasArticlesExtracted(arr: unknown[]): boolean {
return arr.length > 0;
} Try / catch
let articles: unknown[] = [];
for (let attempt = 0; attempt < 2; attempt++) {
const resp = await got({ method: 'get', url: archiveUrl });
articles = extractArticlesFromDOM(load(resp.data));
if (articles.length) break;
}
if (!articles.length) throw new Error('No articles found.'); Prevention
- Keep the archive selectors in `extractArticlesFromDOM` aligned with the live DOM — add a snapshot test against a saved HTML fixture.
- Send `config.trueUA` so Cline serves real content instead of a bot challenge.
- Watch for status 403/503 — that signals a block, not a layout change.
When it happens
Trigger: Cline ships a new blog layout and the archive card selectors change; the archive URL moves or returns a SPA shell with no server-rendered articles; a CDN/Cloudflare interstitial page replaces the real HTML.
Common situations: Site redesign, anti-bot challenge page, or the route's `extractArticlesFromDOM` selectors drifting from the live DOM.
Related errors
- 无法解析页面数据,请检查杂志 ID 是否正确或页面结构是否变动
- Unknown content type for link: ${link}
- 无法解析页面 Props 数据
- Bilibili browser response does not contain video list data
- Failed to fetch announcements, error code: ' + result?.code
AI-assisted analysis of DIYgod/RSSHub@bed535e087 (2026-08-12).
Data as JSON: /api/errors/232e8ab56a61abd4.
Report an issue: GitHub.