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

如何用Beautiful Soup查找嵌套div/class提取Zillow的Zestimate值

提取失败核心原因

两个核心问题导致拿不到数据:

  • 编写的选择器存在语法错误、匹配目标过时,根本定位不到元素
  • Zillow房源详情页为客户端动态渲染,普通requests直接请求返回的初始HTML中,没有浏览器里看到的房产估值DOM节点——这部分数据要么由JS后续接口拉取填充,要么存放在页面内嵌的结构化数据中,直接解析初始响应的普通DOM节点必然返回空。

原有代码的错误点

  • id匹配逻辑错误:attrs={'id':'.Home-value '}中多余的.是class选择器的语法标识,id匹配不需要加;参数末尾带冗余空格,且当前版本Zillow页面根本不存在id为Home-value的div节点,完全匹配不到内容。
  • 类选择器语法+目标错误:.ds-home-values.末尾多了无效的.,且ds-home-values是Zillow早年旧版页面的class名,当前页面早已迭代为带版本号、哈希后缀的动态class,旧class名已失效。另外你定位到的Text-c11n-8-65-2__sc-aiai24-0 eUxMDw也是动态生成的class,版本号、哈希值会随前端发版变动,硬编码这个class不仅当前容易匹配错,后续也会快速失效。
  • 移除pfs-upsell的操作无效:初始请求返回的HTML中根本不存在这个元素,extract操作没有任何实际作用。

可行提取方案

不要硬匹配动态class,Zillow会把包括Zestimate在内的所有房源核心数据,直接存放在页面id为__NEXT_DATA__的内嵌脚本JSON中,不需要运行JS渲染,直接从初始响应里解析这个JSON即可,稳定性远高于DOM匹配。

参考实现代码

import requests
from bs4 import BeautifulSoup
import json

target_url = "https://www.zillow.com/homedetails/2616-Tinmouth-St-Austin-TX-78748/64743359_zpid/"
# 必须携带真实浏览器的请求头,否则会触发Zillow反爬,返回403或空白拦截页
request_headers = {
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9"
}

response = requests.get(target_url, headers=request_headers)
soup = BeautifulSoup(response.text, "html.parser")

# 提取内嵌的结构化页面数据
next_data = soup.find("script", id="__NEXT_DATA__")
page_json = json.loads(next_data.string)

zestimate_result = []
# 定位房源数据缓存节点
gdp_cache = page_json["props"]["pageProps"]["componentProps"]["gdpClientCache"]
# 遍历缓存提取Zestimate估值
for cache_entry in gdp_cache.values():
    property_data = cache_entry.get("property", {})
    if "zestimate" in property_data:
        zestimate_result.append(property_data["zestimate"])

print(zestimate_result)

注意事项

  • 所有对Zillow的请求必须携带合法的User-Agent等浏览器请求头,否则直接触发反爬拦截,拿到的不是正常房源页面,自然解析不到内容。
  • 优先解析内嵌JSON而非匹配DOM:Zillow前端基于styled-components生成哈希class,每次前端发版class名就会变动,硬编码class的写法维护成本极高,内嵌JSON的字段结构稳定性远高于动态class。
  • 如果后续Zillow调整JSON结构,直接在页面源码中搜索__NEXT_DATA__,复制脚本内的JSON格式化后逐层查找zestimate字段的路径,修改代码中对应的键名即可,比重新定位DOM节点效率高很多。

不要一开始就用Selenium、Playwright等自动化工具爬取,Zillow对自动化工具的检测规则很严格,反而更容易被封IP,直接解析内嵌JSON是成本最低、稳定性最高的方案。

内容的提问来源于stack exchange,提问作者max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:15:53