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

