{"record":{"id":"6c58ee945c3430f1","repo":"DIYgod/RSSHub","slug":"comic-not-found-name-6c58ee","errorCode":null,"errorMessage":"Comic Not Found - ${name}","messagePattern":"Comic Not Found - (.+?)","errorType":"validation","errorClass":"InvalidParameterError","httpStatus":null,"severity":"error","filePath":"lib/routes/comicskingdom/index.tsx","lineNumber":51,"sourceCode":"async function handler(ctx) {\n    const baseURL = 'https://comicskingdom.com';\n    const name = ctx.req.param('name');\n    const url = `${baseURL}/${name}/archive`;\n    const { data } = await got(url);\n\n    const $ = load(data);\n\n    // Determine Comic and Author from main page\n    const comic = $('title').text().replace('Comics Kingdom - ', '').trim();\n    const author = $('.feature-title h2').text();\n\n    // Find the links for all non-archived items\n    const links = $('div.tile')\n        .toArray()\n        .map((el) => $(el).find('a').first().attr('href'));\n\n    if (links.length === 0) {\n        throw new InvalidParameterError(`Comic Not Found - ${name}`);\n    }\n    const items = await Promise.all(\n        links.map((link) =>\n            cache.tryGet(link!, async () => {\n                const detailResponse = await got(link);\n                const content = load(detailResponse.data);\n\n                const title = content('meta[property=\"og:description\"]').attr('content');\n                const image = content('meta[property=\"og:image\"]').attr('content');\n                const description = renderToString(<img src={image} />);\n                // Pull the date out of the URL\n                const pubDate = parseDate(link!.slice(link!.lastIndexOf('/') + 1), 'YYYY-MM-DD');\n\n                return {\n                    title: title!,\n                    author,\n                    category: 'comic',\n                    description,","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/DIYgod/RSSHub/blob/bed535e0879dc71c5aff6f1e7bd1ac21ede40115/lib/routes/comicskingdom/index.tsx#L33-L69","documentation":"After fetching a Comics Kingdom page the route scrapes every `div.tile` for its first anchor href. If zero links are found it interprets the empty result as a non-existent comic and throws InvalidParameterError echoing the supplied `name`. An empty link list can also be caused by selector drift rather than a bad name.","triggerScenarios":"`/comicskingdom/<name>` where <name> does not resolve to a real comic, or where the site has changed so `div.tile` no longer matches the listing.","commonSituations":"Typo in the comic slug; the comic was archived or renamed; a site redesign removed or renamed the `div.tile` container so even valid comics yield zero links.","solutions":["Confirm the comic slug by browsing comicskingdom.com and copying the exact path segment.","If the slug is valid but the error persists, the `div.tile` selector has likely drifted — inspect the current HTML and update it.","Report a stale selector to the maintainer with a sample of the new markup."],"exampleFix":"// before\n//   $('div.tile').toArray().map((el) => $(el).find('a').first().attr('href'));\n// after (example selector refresh)\n//   $('div.comic-tile').toArray().map((el) => $(el).find('a').first().attr('href'));","handlingStrategy":"validation","validationCode":"async function comicExists(name: string): Promise<boolean> {\n  const res = await got(`https://www.comicskingdom.com/${name}`);\n  const $ = load(res.data);\n  return $('div.tile').toArray().length > 0;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate the comic slug against the live site before subscribing.","Add a contract test asserting the `div.tile` selector still matches, to catch selector drift.","Distinguish 'not found' from 'selector drifted' by checking the page returned 200."],"tags":["validation","scraping","selector-drift","not-found"],"backgroundTag":null,"analyzedSha":"bed535e0879dc71c5aff6f1e7bd1ac21ede40115","analyzedAt":"2026-08-12T19:29:35.364Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}