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

结合BeautifulSoup与ZenRows爬取数据返回None求助

问题分析与解决方案

你的代码返回None主要有3个核心问题:

1. 错误设置了json_response参数

你在params里开启了"json_response":"true",这会让ZenRows返回JSON格式的响应(包含请求元数据和HTML内容在content字段里),而不是直接返回HTML文本。直接用response.text解析相当于在解析JSON字符串,自然找不到目标元素。

2. js_instructions是无效占位符

你使用的js_instructions是示例占位符(.selector、.input等),没有针对目标页面做实际有效的操作,无法确保目标元素正确加载。

3. 目标元素是移动端可见(md:hidden)

目标class里的md:hidden表示在中等及以上屏幕尺寸下元素会隐藏,默认桌面端视口可能不会渲染这个元素,需要设置移动端视口参数。


修正后的代码

# pip install zenrows beautifulsoup4
from zenrows import ZenRowsClient
from bs4 import BeautifulSoup

# 初始化ZenRows客户端
client = ZenRowsClient("daf1d79772a751a7d680055ed81a0d5b47cb2bb6")
url = "https://www.oneroof.co.nz/property/auckland/bucklands-beach/18-camwell-close/H3rQw"

# 调整参数:关闭JSON响应,设置移动端视口,等待目标元素加载
params = {
    "js_render": "true",  # 启用JS渲染
    "viewport": "375x667",  # 模拟iPhone SE移动端视口,确保md:hidden元素显示
    "wait_for": ".text-xl.md\\:hidden.text-secondary.font-bold"  # 等待目标元素加载完成
}

# 获取响应
response = client.get(url, params=params)

# 确认响应状态(可选,用于调试)
if response.status_code != 200:
    print(f"请求失败,状态码:{response.status_code}")
    exit()

# 解析HTML
soup = BeautifulSoup(response.text, "html.parser")

# 查找目标元素:使用class列表更可靠(避免空格解析问题)
target_element = soup.find(class_=["text-xl", "md:hidden", "text-secondary", "font-bold"])

if target_element:
    print("Oneroof estimate:", target_element.get_text(strip=True))
else:
    # 调试:打印页面内容片段,确认元素是否存在
    print("未找到目标元素,页面片段预览:")
    print(response.text[:1000])

额外调试建议

  • 先打印response.text的前几千字符,确认页面是否正确加载,是否包含目标元素的class。
  • 如果还是找不到,检查目标元素是否需要点击触发加载(比如需要展开某个面板),可以在js_instructions里添加对应的点击指令。
  • 注意ZenRows的参数是否正确,比如wait_for里的选择器需要转义特殊字符(比如:要写成\\:)。

内容的提问来源于stack exchange,提问作者Mei Chen Liu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:13:10