使用Beautiful Soup提取h1标签文本失败:daft.ie网站解析异常求助
问题排查与修复方案
问题根源
- 动态CSS类名失效:你代码里用的
styles__SearchH1-sc-1t5gb6v-3 guZHZl是前端框架生成的动态类名,网站更新后这类名称会发生变化,导致soup.find_all找不到目标元素,触发索引越界或返回None。 - 文本提取方式脆弱:直接把标签转成字符串再做替换的方式极易受页面结构变动影响,容错性极低。
- 缺失请求头(可能触发反爬):部分网站会检测请求的
User-Agent,未携带该字段的请求可能被返回异常页面,导致解析失败。
修复后的代码
import sys import requests from bs4 import BeautifulSoup def get_buy_numbers_dublin_city(): # 添加请求头,模拟浏览器访问 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } page = requests.get("https://www.daft.ie/property-for-sale/dublin-city", headers=headers) page.raise_for_status() # 主动抛出请求错误,便于排查 soup = BeautifulSoup(page.content, 'html.parser') # 使用更稳定的data-testid属性定位元素 h1_element = soup.find("h1", attrs={"data-testid": "search-h1"}) if not h1_element: return "无法找到目标数据" # 直接提取文本并处理 prop_text = h1_element.get_text(strip=True) # 提取数字部分,比如从"1,234 Properties for Sale..."中取数字 prop_num = ''.join(filter(str.isdigit, prop_text)) return prop_num def main(argv): print(get_buy_numbers_dublin_city()) if __name__ == "__main__": main(sys.argv[1:])
关键优化点
- 用
data-testid定位:这类属性是网站为测试预留的,比动态类名稳定得多,几乎不会随前端样式更新而变化。 - 正确提取文本:用
get_text()直接获取标签内的文本,避免手动处理HTML字符串。 - 添加请求头:模拟正常浏览器请求,降低被反爬拦截的概率。
- 异常处理:增加元素存在性检查,避免索引越界错误;用
page.raise_for_status()捕获请求层面的错误(比如403、500)。
内容的提问来源于stack exchange,提问作者DCUpro
相关产品推荐
相关产品推荐

