如何用BeautifulSoup获取含“Hello Friend ”的td的相邻td中的数值6.543
解决方案
问题根源
你的代码报错是因为soup.find("td", text=re.compile("Hello Friend "))返回了None——目标文本Hello Friend 并非直接在<td>的文本内容里,而是嵌套在<td>内部的<b>标签中,text参数只会匹配节点自身的文本,无法识别子节点里的内容,所以找不到对应的<td>。
可行方案
方案1:先定位目标<b>标签,再回溯父节点找<td>
通过找到包含目标文本的<b>标签,再获取它的父<td>,接着定位下一个兄弟<td>,最后提取数值:
import re from bs4 import BeautifulSoup # 假设soup是已解析完成的BeautifulSoup对象 target_b = soup.find("b", text=re.compile("Hello Friend ")) if target_b: # 获取包含该<b>的<td> source_td = target_b.parent # 获取下一个相邻<td> value_td = source_td.find_next_sibling("td") if value_td: # 提取<td>内<b>的文本并转成数值 raw_value = value_td.find("b").get_text(strip=True) target_num = float(raw_value) print(target_num) # 输出6.543
方案2:使用CSS选择器简化定位
利用CSS选择器的:has()和相邻兄弟选择器+,直接定位目标元素:
from bs4 import BeautifulSoup # 用CSS选择器定位:包含指定文本<b>的<td>的下一个<td>里的<b> target_element = soup.select_one('td:has(b:contains("Hello Friend ")) + td b') if target_element: target_num = float(target_element.get_text(strip=True)) print(target_num) # 输出6.543
注意事项
- 确保你的BeautifulSoup版本支持
:has()选择器(需要BeautifulSoup 4.7.0及以上版本) - 加入
if判断可以避免因节点不存在导致的报错,增强代码鲁棒性
内容的提问来源于stack exchange,提问作者aeiou
相关产品推荐
相关产品推荐

