Python&Selenium自动化代码故障:无法正常采集维基百科科学家数据
Python Selenium维基百科科学家数据采集程序故障修复
问题概述
编写的Python+Selenium程序用于从维基百科采集指定科学家的生卒日期、计算年龄并提取首段简介,但运行时浏览器能正常打开页面,却无法输出目标数据,所有科学家均触发TimeoutException错误。
故障原因
- 缺失必要模块导入:代码中使用了
datetime.strptime和time.sleep,但未导入datetime和time模块,会导致运行时错误,进而触发异常捕获。 - 元素选择器不准确:
- 初始选择器未限定查找范围,可能匹配到页面其他无关元素,或无法定位到目标元素。
- 简介的XPATH定位错误,未指向维基百科正确的内容容器。
- 异常信息展示不完整:TimeoutException的错误信息未完整输出,难以定位具体问题。
修复方案
以下是修复后的完整代码及修改说明:
修复后的main.py代码
from robotics import Robot 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 selenium.common.exceptions import TimeoutException # 新增缺失的模块导入 import datetime import time SCIENTISTS = ["Albert Einstein", "Isaac Newton", "Marie Curie", "Charles Darwin"] def main(): robot = Robot("WikiRobot") robot.say_hello() driver = webdriver.Chrome() for scientist in SCIENTISTS: driver.get(f"https://en.wikipedia.org/wiki/{scientist.replace(' ', '_')}") try: # 限定在信息框内查找生卒日期,避免无关元素干扰 birth_date_element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CSS_SELECTOR, "div.infobox span.bday")) ) birth_date = birth_date_element.text death_date_element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CSS_SELECTOR, "div.infobox span.dday")) ) death_date = death_date_element.text # 计算年龄 born = datetime.strptime(birth_date, '%Y-%m-%d') died = datetime.strptime(death_date, '%Y-%m-%d') age = int((died - born).days / 365.25) # 准确定位内容容器中的首段简介 summary = WebDriverWait(driver, 10).until( EC.visibility_of_element_located( (By.XPATH, "//div[@id='mw-content-text']/div[@class='mw-parser-output']/p[1]")) ).text # 整理并展示信息 scientist_info = { "Name": scientist, "Birth Date": birth_date, "Death Date": death_date, "Age": age, "Summary": summary.strip() } print("\n" + "-"*50) for key, value in scientist_info.items(): print(f"{key}: {value}") time.sleep(1) except TimeoutException as e: print(f"处理{scientist}时超时: {str(e)}") except Exception as e: print(f"处理{scientist}时出错: {str(e)}") driver.quit() robot.say_goodbye() if __name__ == "__main__": main()
修改要点
- 补充模块导入:添加
import datetime和import time,解决未定义函数的错误。 - 优化元素定位:
- 生卒日期选择器限定在
div.infobox内,确保只查找信息框中的目标元素。 - 简介XPATH改为指向维基百科官方的内容输出容器
mw-parser-output,避免定位错误。
- 生卒日期选择器限定在
- 完善异常处理:新增通用异常捕获,同时打印完整错误信息,便于问题排查。
- 优化输出格式:添加分隔线和文本去空格处理,提升输出可读性。
robotics.py文件无需修改,可保持原代码不变。
内容的提问来源于stack exchange,提问作者sjord01
相关产品推荐
相关产品推荐

