如何用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
相关产品推荐
相关产品推荐

