结合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
相关产品推荐
相关产品推荐

