← LeaderboardThe Skill Leaderboard

cnki-parse-results

Parse current CNKI search results page into structured paper data (title, authors, journal, date, citations). Use after a search has been performed and you need to extract the results.

Published by cookjohn ↗cookjohn/cnki-skills

Try your first task

cnki-parse-results

Start a fresh conversation.

Use cnki-parse-results to extract the current CNKI search-results page into a numbered list of papers with title, authors, journal, date, type, citations, downloads, and URL; stop and tell me if the current Chrome page is not a CNKI results page or requires captcha completion.

    User-approved starter prompt based on a pinned source version; check current skill requirements before running. Task evidence ↗

    SKILL.md

    name: cnki-parse-resultsdescription: Parse current CNKI search results page into structured paper data (title, authors, journal, date, citations). Use after a search has been performed and you need to extract the results.user-invokable: false

    CNKI Parse Search Results

    Extract structured paper data from the current CNKI search results page.

    Prerequisites

    The current Chrome page must be a CNKI search results page (URL contains kns.cnki.net and page shows "条结果").

    Steps

    1. Verify we are on a results page

    Use mcp__chrome-devtools__take_snapshot. Verify the page contains "条结果". If not, inform the user that no search results page is currently open.

    Check for captcha ("拖动下方拼图完成验证") - if found, notify user to solve it manually.

    2. Extract results via JavaScript

    Use mcp__chrome-devtools__evaluate_script with this function:

    () => {
      const rows = document.querySelectorAll('.result-table-list tbody tr');
      const checkboxes = document.querySelectorAll('.result-table-list tbody input.cbItem');
      const results = Array.from(rows).map((row, index) => {
        const nameCell = row.querySelector('td.name');
        const titleLink = nameCell?.querySelector('a.fz14');
        const authorCell = row.querySelector('td.author');
        const sourceCell = row.querySelector('td.source');
        const dateCell = row.querySelector('td.date');
        const dataCell = row.querySelector('td.data');
        const quoteCell = row.querySelector('td.quote');
        const downloadCell = row.querySelector('td.download');
        const isOnlineFirst = !!nameCell?.querySelector('.marktip');
    
        return {
          number: index + 1,
          title: titleLink?.innerText?.trim() || '',
          url: titleLink?.href || '',
          exportId: checkboxes[index]?.value || '',
          authors: Array.from(authorCell?.querySelectorAll('a.KnowledgeNetLink') || []).map(a => a.innerText?.trim()),
          journal: sourceCell?.querySelector('a')?.innerText?.trim() || '',
          date: dateCell?.innerText?.trim() || '',
          database: dataCell?.innerText?.trim() || '',
          citations: quoteCell?.innerText?.trim() || '',
          downloads: downloadCell?.innerText?.trim() || '',
          isOnlineFirst: isOnlineFirst
        };
      });
    
      const totalText = document.querySelector('.pagerTitleCell')?.innerText || '';
      const totalMatch = totalText.match(/([\d,]+)/);
      const pageInfo = document.querySelector('.countPageMark')?.innerText || '';
    
      return {
        papers: results,
        totalCount: totalMatch ? totalMatch[1] : 'unknown',
        pageInfo: pageInfo
      };
    }
    

    3. Present results

    Format as a numbered list:

    CNKI search results ({totalCount} total, page {pageInfo}):
    
    1. {title} {isOnlineFirst ? "[网络首发]" : ""}
       Authors: {authors joined by "; "}
       Journal: {journal} | Date: {date} | Type: {database}
       Citations: {citations} | Downloads: {downloads}
       URL: {url}
    
    2. ...
    

    4. Fallback: snapshot-based parsing

    If JavaScript returns empty (DOM structure changed), use mcp__chrome-devtools__take_snapshot and parse the accessibility tree manually:

    Look for the repeating pattern:

    • checkbox → StaticText (number) → link with URL containing kcms2/article/abstract (title) → links with URL containing kcms2/author/detail (authors) → link with URL containing navi.cnki.net/knavi/detail (journal) → StaticText (date) → StaticText (database type)

    Verified DOM Selectors (CNKI uses jQuery, stable semantic class names)

    DataSelectorNotes
    Table.result-table-list tbody trEach row = one paper
    Checkboxinput.cbItemvalue = export encrypted ID
    Numbertd.seqRow sequence number
    Titletd.name a.fz14Paper title link
    Authorstd.author a.KnowledgeNetLinkAuthor name links
    Journaltd.source aJournal/source link
    Datetd.datePublication date text
    DB Typetd.dataDatabase type (期刊/学位论文)
    Citationstd.quoteCitation count
    Downloadstd.downloadDownload count
    Online 1sttd.name .marktip"网络首发" label
    Total.pagerTitleCell"共找到 X 条结果"
    Page.countPageMark"1/300" format