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

BeautifulSoup编写的简单代码运行无结果无报错如何解决

问题原因

代码运行无输出、无报错,本质是soup.find_all("section", class_='listing-search-item')返回了空列表,后续for循环没有执行,自然不会打印内容、也不会触发异常。导致空匹配的核心原因按出现概率排序如下:

  • 请求被网站反爬机制拦截。默认情况下requests库携带的请求头会明确标识自身是爬虫程序,Pararius这类租房站点会直接拦截这类请求,返回验证码页、访问拒绝页,页面源码里根本不存在你要匹配的房源标签。
    验证方式:放开代码中注释的print(page),查看返回的状态码,如果是403、401、或者状态码200但打印前500字符的页面内容(print(page.text[:500]))能看到人机验证、访问受限的提示,就能确认是反爬拦截。
    修复方式:给请求添加模拟真实浏览器的User-Agent头,示例写法:
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
    }
    page = requests.get(url, headers=headers)
    
  • 网站前端DOM结构更新,类名与你代码中写的不匹配。如果请求已经正常返回200状态码,还是匹配不到内容,就需要打开目标站点按F12调出开发者工具,核对房源列表对应的section标签、标题/价格/面积/房间数对应的标签类名,和你代码里写的是否完全一致,注意排查类名是否有动态随机后缀、拼写错误、多空格的问题。
  • 代码不规范隐患:你用了Python内置类型名list作为循环变量,虽然本次没有直接触发错误,但会覆盖内置的list类型,后续代码如果用到list()方法会出现意料之外的问题,建议替换成listing这类自定义变量名。
修复后可运行参考代码
from bs4 import BeautifulSoup
import requests

url = "https://www.pararius.com/apartments/amsterdam?ac=1"
# 携带模拟浏览器的请求头绕过基础反爬
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}
page = requests.get(url, headers=headers)
# 先校验请求状态
print(f"请求状态码:{page.status_code}")

soup = BeautifulSoup(page.content, 'html.parser')
listing_list = soup.find_all("section", class_='listing-search-item')
print(f"匹配到的房源总数:{len(listing_list)}")

for listing in listing_list:
    # 每个字段做非空判断,避免个别条目缺字段触发NoneType异常
    title_tag = listing.find("a", class_="listing-search-item__link--title")
    price_tag = listing.find("div", class_="listing-search-item__price")
    area_tag = listing.find("li", class_="illustrated-features__item--surface-area")
    rooms_tag = listing.find("li", class_="illustrated-features__item--number-of-rooms")

    title = title_tag.text.strip() if title_tag else "无标题信息"
    price = price_tag.text.strip() if price_tag else "无价格信息"
    area = area_tag.text.strip() if area_tag else "无面积信息"
    rooms = rooms_tag.text.strip() if rooms_tag else "无房间数信息"

    info = [title, price, area, rooms]
    print(info)
补充说明
  • 提取文本时添加.strip()是为了去掉文本前后多余的换行、缩进空格,输出格式更整洁。
  • 如果加了请求头还是被拦截,说明站点反爬等级更高,需要搭配代理、cookie池、验证码识别能力才能正常抓取,注意控制请求频率,不要给站点造成过大访问压力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:51:26