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

使用Beautiful Soup爬Zillow遇AttributeError: NoneType无contents属性

解决AttributeError: 'NoneType' object has no attribute 'contents'问题

错误原因

你的代码中soup.select_one("script[data-zrr-shared-data-key]")返回了None,说明某一页的HTML里找不到目标script标签,后续调用.contents[0]自然会抛出错误。常见诱因包括:

  • Zillow的反爬机制拦截了请求,返回的页面不是正常房源列表页
  • 部分页码(比如超过实际房源页数的页面)无数据,页面结构和正常页不同
  • 页面HTML结构发生变化,原选择器失效

修复方案

1. 先检查请求有效性

确认请求是否成功,避免解析错误的响应内容:

for surl in surl_list:
    response = requests.get(surl, headers=headers)
    # 检查请求状态码
    if response.status_code != 200:
        print(f"请求失败,状态码:{response.status_code},URL:{surl}")
        continue
    soup = BeautifulSoup(response.content, "html.parser")

2. 判断目标元素是否存在

在访问contents前,先确认script标签是否找到:

for surl in surl_list:
    response = requests.get(surl, headers=headers)
    if response.status_code != 200:
        print(f"请求失败,状态码:{response.status_code},URL:{surl}")
        continue
    soup = BeautifulSoup(response.content, "html.parser")
    script_tag = soup.select_one("script[data-zrr-shared-data-key]")
    if not script_tag:
        print(f"未找到目标script标签,URL:{surl}")
        continue
    # 继续解析数据
    sdata = json.loads(script_tag.contents[0].strip("!<>-"))
    sdata_list += sdata["cat1"]["searchResults"]["listResults"]

3. 优化反爬应对

Zillow对爬虫限制严格,可尝试这些调整:

  • 更新User-Agent为当前浏览器的最新版本,避免使用过时UA
  • 在请求之间添加延迟(比如time.sleep(2)),模拟人类访问节奏
  • 考虑使用代理IP,避免IP被封禁

完整修改后的代码

import requests
from bs4 import BeautifulSoup
import json
import time

surl_list = []
for i in range(1, 21):
    surl = 'https://www.zillow.com/' + city +'rentals/' + str(i) + '_p/'
    surl_list.append(surl)

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"
}

sdata_list = []

for surl in surl_list:
    try:
        response = requests.get(surl, headers=headers)
        response.raise_for_status()  # 主动抛出HTTP错误
        soup = BeautifulSoup(response.content, "html.parser")
        script_tag = soup.select_one("script[data-zrr-shared-data-key]")
        if not script_tag:
            print(f"跳过页面:{surl},未找到目标数据标签")
            continue
        sdata = json.loads(script_tag.contents[0].strip("!<>-"))
        sdata_list += sdata["cat1"]["searchResults"]["listResults"]
        time.sleep(2)  # 添加访问延迟
    except Exception as e:
        print(f"处理页面{surl}时出错:{str(e)}")
        continue

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:07:48