批量爬取Smith圣经词典希伯来名字定义的技术问题
解决方法
原代码直接用soup.find('i')会匹配页面中无关的<i>标签,导致无法精准获取目标名字的定义。以下是优化后的实现方案:
优化后的代码
import requests from bs4 import BeautifulSoup smiths_names = {} test = ["aaron", "abednego"] # 替换为你的实际名字列表 for name in test: url = f"https://www.biblestudytools.com/dictionaries/smiths-bible-dictionary/{name}.html" try: page = requests.get(url) page.raise_for_status() # 捕获HTTP请求错误(如404页面不存在) soup = BeautifulSoup(page.content, 'html.parser') # 先定位到包含目标名字的标题,再获取其后方的定义标签 name_heading = soup.find('h1', string=lambda text: text and name.capitalize() in text) if name_heading: # 获取标题后第一个<i>标签(对应名字的定义) definition_tag = name_heading.find_next('i') if definition_tag: meaning = definition_tag.get_text(strip=True) smiths_names[name] = meaning else: print(f"{name} 的定义标签未找到") else: print(f"{name} 的页面标题未找到") except requests.exceptions.RequestException as e: print(f"请求 {name} 页面出错: {e}") # 输出最终爬取结果 print(smiths_names)
核心调整说明
- 精准元素定位:通过匹配包含目标名字的
<h1>标题,再用find_next('i')锁定紧随其后的定义标签,避免抓取无关内容。 - 循环内错误处理:将
try-except放到循环内部,单个名字请求失败不会中断整个遍历流程。 - HTTP错误捕获:添加
raise_for_status(),主动抛出404、500等HTTP状态码错误,便于排查问题。
若目标页面结构发生变化,可根据实际HTML结构调整选择器(比如用类名定位容器:soup.find('div', class_='definition-container').find('i'))。
内容的提问来源于stack exchange,提问作者Glaikit7
相关产品推荐
相关产品推荐

