如何用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
相关产品推荐
相关产品推荐

