如何使用Selenium在浏览器中直接打开XML文件而不自动下载
解决方案
核心是修改Chrome浏览器的默认行为,让XML类型的文件直接在浏览器内渲染,而不是触发下载,修改配置后直接读取页面源码即可获取XML内容。
步骤1:添加Chrome启动参数配置
在初始化ChromeOptions的时候添加偏好设置(prefs),指定XML类型的内容直接在浏览器打开,禁止自动下载,需要添加的配置项:
- 禁用下载提示
- 指定
application/xml、text/xml、application/xhtml+xml等XML相关MIME类型无需下载直接打开 - 禁用默认的下载保存询问
步骤2:处理标签页切换(可选)
如果点击Metadata链接是打开新标签页,需要切换到新打开的标签页后再读取源码,读取完成后可以关闭该标签页切回原列表页,避免标签页过多占用资源。
步骤3:直接获取XML源码
页面加载完成后,直接调用driver.page_source即可获取完整的XML源代码,可直接交给BeautifulSoup解析或者保存到本地。
调整后完整代码
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from bs4 import BeautifulSoup from time import sleep # Initialize webdriver driver_options = Options() driver_options.headless = True # 新增Chrome偏好配置,禁止XML自动下载,直接在浏览器打开 prefs = { "download.default_directory": "/dev/null", # 临时下载目录设为空,避免残留文件 "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": True, # 配置XML相关MIME类型直接在浏览器打开,不触发下载 "browser.helperApps.neverAsk.saveToDisk": "application/xml, text/xml, application/xhtml+xml, text/xsl", "browser.helperApps.alwaysAsk.force": False } driver_options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(options=driver_options, executable_path="bin/chromedriver") # Get Index page url = "https://www.ems-ph.org/journals/all_issues.php?issn=1660-8933" driver.get(url) sleep(10) # 记录初始标签页id,方便后续切回 original_window = driver.current_window_handle for td in driver.find_elements(By.CLASS_NAME, 'remark'): td.find_element(By.LINK_TEXT, 'Metadata').click() sleep(3) # 切换到新打开的XML标签页 for window_handle in driver.window_handles: if window_handle != original_window: driver.switch_to.window(window_handle) break # 获取XML源码 xml_source = driver.page_source print(xml_source) # 此处可替换为你的解析/保存逻辑 # 关闭当前XML标签页,切回原列表页 driver.close() driver.switch_to.window(original_window) sleep(1) # 最后关闭驱动 driver.quit()
备选方案(更稳定)
无需修改浏览器配置,直接提取链接地址后主动访问,避免点击事件绑定的下载逻辑,适配性更强:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from bs4 import BeautifulSoup from time import sleep # Initialize webdriver driver_options = Options() driver_options.headless = True driver = webdriver.Chrome(options=driver_options, executable_path="bin/chromedriver") # Get Index page url = "https://www.ems-ph.org/journals/all_issues.php?issn=1660-8933" driver.get(url) sleep(10) for td in driver.find_elements(By.CLASS_NAME, 'remark'): # 提取Metadata链接地址,不触发点击操作 meta_link = td.find_element(By.LINK_TEXT, 'Metadata').get_attribute('href') # 直接访问XML资源地址 driver.get(meta_link) sleep(3) # 直接获取XML源码 xml_source = driver.page_source print(xml_source) # 此处可替换为你的解析/保存逻辑 # 返回原列表页继续处理下一个链接 driver.back() sleep(1) # 最后关闭驱动 driver.quit()
注意事项
- 如果点击链接没有打开新标签页,可删除第一种方案中的标签页切换逻辑,直接在当前页读取
page_source即可 - 可通过浏览器F12网络面板查看Metadata请求的响应头
Content-Type字段,根据实际返回的MIME类型调整配置中的允许打开类型列表
内容的提问来源于stack exchange,提问作者user9640175
相关产品推荐
相关产品推荐

