嵌套For循环覆盖文件:爬虫无法生成独立PDF文件的问题
问题修复方案
问题1:嵌套循环逻辑错误
你的外层循环遍历单词链接,每次拿到新PDF链接后,内层循环会遍历所有单词并覆盖它们的PDF文件,导致每个链接都会重写所有单词的PDF,最终所有文件内容完全重复。
修复思路:
将单词和对应的LEO链接一一绑定,每处理一个单词的链接,就只下载该单词对应的PDF,而非遍历所有单词。假设links列表和WordsDictionary的键顺序一致,用zip将两者配对遍历即可。
问题2:仅适配名词,动词处理报错
你固定查找title为Substantivtabelle öffnen的按钮,这只适用于名词。动词的变格表按钮title为Konjugationstabelle öffnen,因此处理动词时会因找不到元素报错。
修复思路:
- 兼容不同词性的按钮查找逻辑,先尝试名词按钮,找不到则切换动词按钮;
- 添加异常捕获,遇到元素未找到的情况直接跳过该单词,避免脚本终止。
修正后的代码
import os import time from pathlib import Path import requests from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException # 假设links与WordsDictionary的键顺序一一对应 for wordVar, leoWordLink in zip(WordsDictionary.keys(), links): driver.get(leoWordLink) try: getTableClass = driver.find_element(By.CLASS_NAME, "is-clickable") # 优先查找名词变格表按钮,失败则尝试动词按钮 try: getTableClass.find_element(By.XPATH, "//a[@title='Substantivtabelle öffnen']").click() except NoSuchElementException: getTableClass.find_element(By.XPATH, "//a[@title='Konjugationstabelle öffnen']").click() time.sleep(5) # 优化XPATH匹配,避免因class属性空格/顺序问题找不到元素 getPdfTable = driver.find_element(By.XPATH, "//ion-toolbar[contains(@class, 'ion-color-tertiary')]") getPdflink = getPdfTable.find_element(By.XPATH, "//ion-button[contains(@class, 'ion-color-primary') and contains(@class, 'button-clear')]").get_attribute("href") pdflink = "https://dict.leo.org/" + getPdflink print(f"获取到单词 {wordVar} 的PDF链接: {pdflink}") # 统一处理目录,避免频繁切换路径 pdf_dir = Path(cwd) / "pdfsDir" pdf_dir.mkdir(exist_ok=True) # 确保目录存在 filename = pdf_dir / f"WordPDF_{wordVar}.pdf" response = requests.get(pdflink) filename.write_bytes(response.content) print(f"已保存 {wordVar} 的PDF文件") except NoSuchElementException as e: print(f"处理单词 {wordVar} 时出错:找不到对应元素,跳过。错误信息: {str(e)}") continue
关键修改点说明
- 循环逻辑修正:用
zip配对单词与对应链接,每次循环只处理单个单词的PDF,彻底避免覆盖问题; - 多词性适配:兼容名词和动词的变格表按钮,添加异常捕获保证脚本稳定性;
- 路径优化:使用
Path对象管理文件路径,确保目标目录存在,避免os.chdir的频繁切换; - XPATH优化:用
contains匹配class属性,解决原代码中因class属性空格导致的元素查找失败问题。
内容的提问来源于stack exchange,提问作者miguel
相关产品推荐
相关产品推荐

