使用BeautifulSoup从维基百科HTML中完整提取铁路事故相关链接
问题解决方案
现有代码问题
find('a')仅返回匹配到的第一个<a>标签,这是你只能拿到第一条链接的核心原因- 标签筛选参数语法错误:
attrs={'class':'href'=="accident"}是无效写法,实际运行时不会按照你预期筛选链接 - 没有异常处理逻辑,遇到无href属性的标签会直接抛出错误终止运行
- 缺少可扩展的关键词过滤逻辑,无法覆盖disaster、tragedy等其他事故相关词条
优化后代码
# 可扩展的事故相关关键词列表,后续有新的相关词直接添加即可 RELATED_KEYWORDS = {'accident', 'disaster', 'tragedy', 'crash', 'collision'} # 用set存储自动去重 list_of_urls = set() for file in files: try: with open(f'files_overview/{file}', encoding="utf-8") as f: text = f.read() soup = BeautifulSoup(text, features="lxml") # 遍历所有内容容器 for content_div in soup.find_all("div", attrs={'class':'mw-content-ltr'}): # 拿到容器下所有a标签,而不是只取第一个 for a_tag in content_div.find_all('a', href=True): href = a_tag['href'] # 只保留/wiki/开头的词条链接,排除帮助页、特殊页等无关内容 if not href.startswith('/wiki/'): continue # 检查链接文本或链接路径是否包含相关关键词 link_text = a_tag.get_text(strip=True).lower() link_path = href.lower() if any(keyword in link_text or keyword in link_path for keyword in RELATED_KEYWORDS): full_url = "https://en.wikipedia.org" + href list_of_urls.add(full_url) except Exception as e: print(f"处理文件{file}时出错:{e}") # 可选:如果需要转回list格式 list_of_urls = list(list_of_urls)
核心优化点
- 改用
find_all('a', href=True)提取容器下所有带href属性的a标签,不会遗漏符合条件的链接 - 新增关键词匹配逻辑,同时检查链接文本和链接路径,覆盖你提到的多关键词需求,关键词列表可随时扩展
- 新增无关链接过滤逻辑,自动排除维基帮助页、特殊功能页等非词条内容
- 用set存储链接自动去重,避免重复录入相同链接
- 新增异常处理逻辑,单个文件解析错误不会中断整体运行
- 改用with语句读取文件,避免文件句柄泄漏
内容的提问来源于stack exchange,提问作者Scapegoat
相关产品推荐
相关产品推荐

