BeautifulSoup查找HTML中存在的指定文本无输出如何解决
问题根因
你的代码存在两处核心错误,同时有一处容易被忽略的隐患,最终导致匹配不到目标内容:
BeautifulSoup.find()首个位置参数的作用是指定要查找的HTML标签名,你直接传入目标文本'Frisco BBQ Challenge',相当于在查找名称为Frisco BBQ Challenge的自定义标签,这类标签在页面中不存在,自然返回空结果。- 你没有限定搜索范围为
<b>标签,也没有配置文本匹配参数,无法定位到嵌套在标签内部的目标文本。 - 未携带请求头直接发起请求,大概率会被站点反爬策略拦截,返回的响应内容和你在浏览器中看到的页面源码不一致,也会造成匹配失败。
修正代码
以下两种实现都可以准确获取到目标内容,按需选择即可:
方法1:遍历标签匹配文本
先拿到页面中所有<b>标签,逐个判断标签内的文本是否为目标值:
from bs4 import BeautifulSoup import requests url = "https://mms.kcbs.us/members/evr_search.php?org_id=KCBA" # 补充常规请求头绕过基础反爬 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } resp = requests.get(url, headers=headers) resp.encoding = resp.apparent_encoding # 自动识别编码避免乱码 doc = BeautifulSoup(resp.text, features="lxml") target = None for b_tag in doc.find_all("b"): # 去除文本前后的空白字符、换行后再匹配 if b_tag.get_text(strip=True) == "Frisco BBQ Challenge": target = b_tag break print(target) # 打印完整的<b>标签 # 如需提取纯文本,使用 print(target.get_text(strip=True))
方法2:通过find的string参数直接匹配
直接给find()传入标签名和文本匹配规则,一步定位目标标签:
from bs4 import BeautifulSoup import requests import re url = "https://mms.kcbs.us/members/evr_search.php?org_id=KCBA" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } resp = requests.get(url, headers=headers) resp.encoding = resp.apparent_encoding doc = BeautifulSoup(resp.text, features="lxml") # 精确匹配文本 # target = doc.find("b", string="Frisco BBQ Challenge") # 如果文本前后可能有多余空格/换行,用正则模糊匹配兼容性更好 target = doc.find("b", string=re.compile(r"Frisco BBQ Challenge")) print(target)
补充说明
如果运行后还是匹配不到,先打印resp.text查看返回的页面内容是否和浏览器中看到的一致,确认是否被反爬拦截、是否需要携带Cookie等额外参数。
内容的提问来源于stack exchange,提问作者user19341179
相关产品推荐
相关产品推荐

