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

