如何用BeautifulSoup获取相邻th对应的td文本?
解决BeautifulSoup获取ETF Risk对应文本的问题
问题原因
你的代码失败主要有两个核心原因:
- 页面中
<th>的文本并非完全等于"ETF Risk",可能包含前后空格、换行符,导致精确匹配失效。 - 未添加请求头模拟浏览器访问,被网站反爬机制拦截,获取的页面内容不完整。
修正后的代码
import requests from bs4 import BeautifulSoup url = "https://www.zacks.com/funds/etf/VTI/profile?q=vti" # 添加请求头模拟浏览器访问,避免反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') # 用lambda模糊匹配包含目标文本的<th>,兼容文本格式差异 risk_th = soup.find('th', string=lambda x: x and "ETF Risk" in x.strip()) if risk_th: # 查找相邻的<td>元素 risk_td = risk_th.find_next_sibling('td') if risk_td: risk_text = risk_td.text.strip() print(risk_text) # 输出结果为 "Med" else: print("未找到对应ETF Risk的<td>元素") else: print("未找到包含ETF Risk的<th>元素")
关键修正点
- 模糊匹配文本:用
lambda x: x and "ETF Risk" in x.strip()替代精确匹配,兼容文本中的空格、换行等格式差异。 - 添加请求头:模拟浏览器请求,确保获取完整的页面结构,避免被反爬拦截。
- 容错处理:增加元素存在性判断,避免因元素缺失导致的代码报错。
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

