You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Beautiful Soup提取h1标签文本失败:daft.ie网站解析异常求助

问题排查与修复方案

问题根源

  1. 动态CSS类名失效:你代码里用的styles__SearchH1-sc-1t5gb6v-3 guZHZl是前端框架生成的动态类名,网站更新后这类名称会发生变化,导致soup.find_all找不到目标元素,触发索引越界或返回None。
  2. 文本提取方式脆弱:直接把标签转成字符串再做替换的方式极易受页面结构变动影响,容错性极低。
  3. 缺失请求头(可能触发反爬):部分网站会检测请求的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 03:28:28