BeautifulSoup解析异常:无法获取Zenodo搜索页标题求助
嘿,我遇到过类似的问题!Zenodo的搜索页面内容是通过JavaScript动态渲染的,这就是为什么你用requests+BeautifulSoup只能拿到空列表——静态请求获取的初始HTML里根本没有你要找的标题元素,它们是页面加载后由JS动态生成的。下面给你两个可行的解决方案:
方案1:使用动态渲染工具(Selenium)
这类工具可以模拟真实浏览器的行为,等待页面完全渲染后再提取内容,完美解决动态加载的问题。
步骤:
- 安装依赖库:
pip install selenium webdriver-manager
- 编写代码:
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 from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.service import Service from bs4 import BeautifulSoup # 自动管理Chrome驱动,无需手动下载 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) try: # 访问目标搜索页面 driver.get("https://zenodo.org/search?page=1&size=20&q=broma") # 等待搜索结果标题加载完成(选择器根据页面实际元素调整,这里用.record-title示例) WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".record-title")) ) # 拿到渲染后的页面源码,再用BeautifulSoup解析 page_source = driver.page_source soup = BeautifulSoup(page_source, 'html.parser') # 提取所有标题文本 titles = [title.get_text(strip=True) for title in soup.select(".record-title")] print(titles) finally: # 确保浏览器关闭 driver.quit()
方案2:调用Zenodo官方API(更推荐)
Zenodo提供了专门的REST API,直接调用API获取数据比爬取网页更稳定、高效,完全不需要处理动态渲染问题。
代码示例:
import requests # 构造API请求参数 params = { "q": "broma", "page": 1, "size": 20 } # 发送GET请求到Zenodo搜索API response = requests.get("https://zenodo.org/api/records", params=params) response.raise_for_status() # 检查请求是否成功 # 解析JSON格式的响应数据 data = response.json() # 提取所有记录的标题 titles = [record["metadata"]["title"] for record in data["hits"]["hits"]] print(titles)
这个方法不仅能拿到标题,还能轻松获取作者、DOI、发布日期等更多元数据,而且API的请求规则清晰,不会因为页面结构变化导致代码失效。
内容的提问来源于stack exchange,提问作者Jorge Galán
相关产品推荐
相关产品推荐

