com um clique
ieee-paper-detail
// Extracts full metadata from an IEEE Xplore article page (abstract, authors, keywords, DOI, references, PDF link). Use when the user wants details about a specific paper.
// Extracts full metadata from an IEEE Xplore article page (abstract, authors, keywords, DOI, references, PDF link). Use when the user wants details about a specific paper.
Performs advanced search on IEEE Xplore with filters like author, title, publication, year, DOI. Use when the user wants filtered academic paper search.
Downloads PDF from IEEE Xplore articles. Requires institutional or subscriber access. Use when the user wants to download a paper PDF by article number.
Exports citations from IEEE Xplore in RIS, BibTeX, or plain text format. Supports pushing to Zotero. Use when the user wants to export or save citation data for papers.
Browses a journal or conference on IEEE Xplore — views info, impact factor, latest articles, and specific issues. Use when the user asks about a journal/conference or wants to browse its contents.
Navigates pages, changes sort order, or adjusts results per page on IEEE Xplore search results. Use when the user wants to go to the next page, sort by date or citations, or change results per page.
Re-parses the currently open IEEE Xplore search results page. Internal skill used by other skills to extract structured data without navigation.
| name | ieee-paper-detail |
| description | Extracts full metadata from an IEEE Xplore article page (abstract, authors, keywords, DOI, references, PDF link). Use when the user wants details about a specific paper. |
| argument-hint | [article number or URL] |
Extract complete metadata from an IEEE Xplore article page.
Determine the article URL from $ARGUMENTS:
8876906): URL is {BASE_URL}/document/{ARNUMBER}/https://doi.org/{DOI} (will redirect to IEEE Xplore)Use navigate_page with initScript:
navigate_page({
url: "{article_url}",
initScript: "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
If the article is already open in the current tab, skip navigation and go directly to Step 3.
After navigation, verify:
Use evaluate_script with built-in waiting. Do NOT use wait_for.
async () => {
// Wait for article content to load (up to 15s)
for (let i = 0; i < 30; i++) {
if (document.querySelector('.document-title') || document.querySelector('h1[class*="title"]')) break;
await new Promise(r => setTimeout(r, 500));
}
const result = {};
// Title
result.title = document.querySelector('.document-title span')?.textContent?.trim() ||
document.querySelector('h1[class*="title"]')?.textContent?.trim() || '';
// Authors
result.authors = [...document.querySelectorAll('.authors-info a[href*="/author/"]')]
.map(a => a.textContent.trim()).filter(Boolean);
// Abstract
result.abstract = document.querySelector('.abstract-text div[xplmathjax]')?.textContent?.trim() ||
document.querySelector('.abstract-text')?.textContent?.trim() || '';
// DOI
const doiLink = document.querySelector('a[href*="doi.org"]');
result.doi = doiLink?.textContent?.trim() || '';
// Publication info
result.publication = document.querySelector('.stats-document-abstract-publishedIn a')?.textContent?.trim() || '';
// Meta info (Published in, Date, DOI, Publisher, Conference Location, etc.)
const metaItems = document.querySelectorAll('.abstract-desktop-div .u-pb-1');
result.metaInfo = [...metaItems].map(el => el.textContent.trim().replace(/\s+/g, ' ')).filter(Boolean);
// Keywords - multiple fallback strategies (keywords section may need scrolling to load)
// Strategy 1: keywords module links
let kwLinks = document.querySelectorAll('.stats-keywords-module a');
result.keywords = [...kwLinks].map(a => a.textContent.trim()).filter(Boolean);
// Strategy 2: keyword list items
if (result.keywords.length === 0) {
const kwItems = document.querySelectorAll('.doc-keywords-list-theme li a, .doc-keywords-list li a');
result.keywords = [...kwItems].map(a => a.textContent.trim()).filter(Boolean);
}
// Strategy 3: extract from the plain text citation (keywords field inside citation text)
if (result.keywords.length === 0) {
const kwMatch = document.body.innerText.match(/keywords:\s*\{([^}]+)\}/i);
if (kwMatch) {
result.keywords = kwMatch[1].split(';').map(k => k.trim()).filter(Boolean);
}
}
// Strategy 4: meta tag
if (result.keywords.length === 0) {
const kwMeta = document.querySelector('meta[name="keywords"]');
if (kwMeta) {
result.keywords = kwMeta.content.split(',').map(k => k.trim()).filter(Boolean);
}
}
// PDF link
const pdfLink = document.querySelector('a[href*="stamp/stamp.jsp"]');
result.pdfUrl = pdfLink?.href || '';
// Article number from URL
result.arnumber = window.location.pathname.match(/\/document\/(\d+)/)?.[1] || '';
// Cited by count — use multiple strategies
const citeMetric = [...document.querySelectorAll('.document-banner-metric')].find(el => el.textContent.includes('Cites'));
result.citedBy = citeMetric?.querySelector('.document-banner-metric-count')?.textContent?.trim() || '';
// Fallback: regex from button text like "70Cites inPapers"
if (!result.citedBy) {
const citeBtn = [...document.querySelectorAll('button')].find(b => b.textContent.includes('Cites'));
const citeMatch = citeBtn?.textContent?.match(/(\d+)\s*Cites/);
result.citedBy = citeMatch ? citeMatch[1] : '';
}
// Full text views
const viewMetric = [...document.querySelectorAll('.document-banner-metric')].find(el => el.textContent.includes('Views'));
result.fullTextViews = viewMetric?.querySelector('.document-banner-metric-count')?.textContent?.trim() || '';
if (!result.fullTextViews) {
const viewBtn = [...document.querySelectorAll('button, .document-banner-metric')].find(b => b.textContent.includes('Views'));
const viewMatch = viewBtn?.textContent?.match(/(\d[\d,]*)\s*Full/);
result.fullTextViews = viewMatch ? viewMatch[1] : '';
}
// Section headings (article structure / TOC)
result.sections = [...document.querySelectorAll('.document-toc a, h2')]
.map(el => el.textContent.trim())
.filter(t => t && !t.includes('Abstract') && t.length < 100)
.slice(0, 20);
// References count
const refSection = document.querySelector('#references');
const refItems = document.querySelectorAll('.reference-container, [class*="reference-item"]');
result.referenceCount = refItems.length;
return result;
}
Format the output clearly:
## {title}
**Authors**: {authors}
**Publication**: {publication}
**DOI**: {doi}
**Article #**: {arnumber}
### Meta Info
{metaInfo items, each on its own line}
### Abstract
{abstract}
### Keywords
{keywords}
### Article Structure
{sections}
**Cited by**: {citedBy} papers
**Full Text Views**: {fullTextViews}
**PDF**: {pdfUrl or "Not available"}
| Element | Selector |
|---|---|
| Title | .document-title span |
| Authors | .authors-info a[href*="/author/"] |
| Abstract | .abstract-text div[xplmathjax] |
| DOI link | a[href*="doi.org"] |
| Publication | .stats-document-abstract-publishedIn a |
| Meta items | .abstract-desktop-div .u-pb-1 |
| Keywords | .stats-keywords-module a |
| PDF link | a[href*="stamp/stamp.jsp"] |
| Cite button | button containing text "Cite This" |
| Cited by count | .document-banner-metric-count |
| Section headings | .document-toc a, h2 |
{BASE_URL}/stamp/stamp.jsp?tp=&arnumber={ARNUMBER}arnumber is the universal identifier across IEEE Xplore (like PII on ScienceDirect).initScript on every navigate_page call.navigate_page + evaluate_script.