You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python从IEEE Xplore提取嵌入JavaScript中的DOI?

解决IEEE Xplore页面中JavaScript嵌入的DOI提取问题

嘿,我帮你搞定这个问题!IEEE Xplore的DOI藏在JavaScript里,普通的requests+BeautifulSoup拿不到是因为它们只抓取静态HTML,没等页面的JS执行渲染就结束了。给你三个靠谱的解决方案,按需选就行:

方法一:用Selenium模拟浏览器渲染动态内容

这招最直接——启动真实浏览器,等页面JS加载完成后再抓内容,完全模拟人类浏览的过程,能拿到所有渲染后的元素。

首先得装依赖:pip install selenium,还要下载对应浏览器版本的驱动(比如Chrome的chromedriver),然后跑这段代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = "https://ieeexplore.ieee.org/document/6933872"

# 初始化Chrome浏览器(记得把chromedriver路径配置好,或者放系统PATH里)
driver = webdriver.Chrome()
driver.get(url)

try:
    # 最多等10秒,直到DOI对应的meta标签加载出来
    doi_meta = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "meta[name='citation_doi']"))
    )
    doi = doi_meta.get_attribute("content")
    print(f"提取到的DOI: {doi}")
finally:
    # 用完记得关掉浏览器
    driver.quit()

方法二:直接从页面脚本里抠JSON数据(推荐轻量场景)

IEEE Xplore会把文档的元数据(包括DOI)存在页面的<script>标签里的JSON对象中,不用等渲染,直接用正则把这段JSON扒出来解析就行,速度比Selenium快多了。

代码示例:

import requests
import re
import json

url = "https://ieeexplore.ieee.org/document/6933872"
# 加个User-Agent,避免被网站当成机器人拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

response = requests.get(url, headers=headers)
html = response.text

# 用正则匹配包含文档元数据的脚本块
metadata_pattern = re.compile(r'window\.document\.metadata = ({.*?});', re.DOTALL)
match_result = metadata_pattern.search(html)

if match_result:
    # 把匹配到的JSON字符串转成Python字典
    metadata = json.loads(match_result.group(1))
    doi = metadata.get("doi")
    if doi:
        print(f"提取到的DOI: {doi}")
    else:
        print("没在元数据里找到DOI字段")
else:
    print("没找到存储元数据的脚本块")

方法三:用IEEE官方API(最稳定的批量方案)

如果你需要批量爬取,强烈用官方API——IEEE提供了专门的接口,直接请求就能拿到结构化的文档数据,完全不用担心页面结构变化导致代码失效。不过得先去IEEE开发者门户注册个账号,拿到API密钥。

示例代码(替换成你的API密钥):

import requests

your_api_key = "这里填你的API密钥"
document_id = "6933872"
# 构造API请求地址
api_url = f"https://ieeexploreapi.ieee.org/api/v1/search/articles?article_number={document_id}&apikey={your_api_key}"

response = requests.get(api_url)
data = response.json()

if data.get("articles"):
    doi = data["articles"][0].get("doi")
    print(f"提取到的DOI: {doi}")
else:
    print("没找到该文档的信息")

总结一下:

  • 偶尔抓几个DOI?用方法二,快又省心;
  • 页面动态渲染特别复杂?用方法一;
  • 批量爬取或者追求长期稳定?必须选方法三。

内容的提问来源于stack exchange,提问作者Nikita Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:31:32