jackwener/OpenCLI · error · CommandExecutionError

Google Scholar result cards were present but no rows could b

Error message

Google Scholar result cards were present but no rows could be extracted

What it means

The search page's result cards (`.gs_r.gs_or.gs_scl`) were found (`resultCount > 0`), but the per-card extraction produced zero rows — every card was skipped, which happens when each card lacks a title anchor (`.gs_rt a, h3 a`) with non-empty text. The command treats this as a hard error rather than an empty result, since visible results clearly existed.

Source

Thrown at clis/google-scholar/search.js:67

            rank: results.length + 1,
            title,
            authors: authors.slice(0, 80),
            source: source.slice(0, 60),
            year,
            cited,
            url,
          });
          if (results.length >= ${limit}) break;
        }
        return { items: results, resultCount: resultCards.length };
      })()
    `);
        if (!wrapper || typeof wrapper !== 'object' || !Array.isArray(wrapper.items)) {
            throw new CommandExecutionError('Google Scholar search returned an unexpected payload shape');
        }
        if (wrapper.items.length === 0) {
            if (Number(wrapper.resultCount) > 0) {
                throw new CommandExecutionError('Google Scholar result cards were present but no rows could be extracted');
            }
            throw new EmptyResultError('google-scholar/search', 'Try a different query or check whether Google Scholar returned a CAPTCHA.');
        }
        return wrapper.items;
    },
});

View on GitHub (pinned to 49907e53dc)

Solutions

  1. Rephrase the query to target papers with linked titles rather than citation-only stubs.
  2. Retry — if the page was mid-render, a re-run will usually extract rows.
  3. Check scholar.google.com in a browser for the same query to see if results are citation-stubs; if markup changed, the command selectors need updating.
  4. Catch the CommandExecutionError and treat as empty/no-results in your pipeline.

Example fix

// before
opencli run google-scholar search "rare citation-only author name"
// after
opencli run google-scholar search "author name paper title keyword"  // query with linked results
Defensive patterns

Strategy: fallback

Try / catch

try {
  rows = await run('google-scholar search', query);
} catch (e) {
  if (/no rows could be extracted/.test(e.message)) {
    rows = await fallbackSearch(query); // e.g. Semantic Scholar / Crossref
  } else throw e;
}

Prevention

When it happens

Trigger: Calling `google-scholar search <query>` where Scholar returns result cards rendered as citation-only entries ([CITATION] entries without links), or a layout change removed `.gs_rt a` anchors, or the cards are present but still rendering their content when the script ran.

Common situations: Queries matching only 'CITATION' stub records on Scholar; mid-render evaluation on slow connections; Scholar A/B DOM changes; localized markup variations in zh-CN (`hl=zh-CN`) affecting the title selectors.

Related errors


AI-assisted analysis of jackwener/OpenCLI@49907e53dc (2026-08-29). Data as JSON: /api/errors/4865c26a2c78af8c. Report an issue: GitHub.