You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python&Selenium自动化代码故障:无法正常采集维基百科科学家数据

Python Selenium维基百科科学家数据采集程序故障修复

问题概述

编写的Python+Selenium程序用于从维基百科采集指定科学家的生卒日期、计算年龄并提取首段简介,但运行时浏览器能正常打开页面,却无法输出目标数据,所有科学家均触发TimeoutException错误。

故障原因

  1. 缺失必要模块导入:代码中使用了datetime.strptime和time.sleep,但未导入datetime和time模块,会导致运行时错误,进而触发异常捕获。
  2. 元素选择器不准确:
    • 初始选择器未限定查找范围,可能匹配到页面其他无关元素,或无法定位到目标元素。
    • 简介的XPATH定位错误,未指向维基百科正确的内容容器。
  3. 异常信息展示不完整: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:57:45