网页爬取无返回值求助:38页房产网站数据爬取失败
问题分析与修正方案
原代码的核心问题
- 列表覆盖而非追加:第一个循环中每次给
lists重新赋值,循环结束后lists仅保留最后一页的元素,前面页面的数据全部丢失。 - 选择器错误:
soup.select("ct-div-block property-outer")写法错误,类选择器需要用.前缀,多个类名用.连接,正确写法是.ct-div-block.property-outer,否则无法匹配到目标元素。 - 循环范围不足:
range(1,38)只会遍历1到37页,要爬取38页需改为range(1,39)。 - 数据未全局存储:第二个循环在页码循环外部,且每次仅赋值单个
info,没有将所有页面的数据收集到一个全局列表中。
修正后的代码
from bs4 import BeautifulSoup import requests # 初始化全局列表存储所有页面的房产数据 all_properties = [] # 遍历1到38页 for page in range(1, 39): # 发起请求,处理可能的请求异常 try: response = requests.get(f"https://rah.co.uk/property_area/to-buy/{page}.html") response.raise_for_status() # 检查请求是否成功 except requests.exceptions.RequestException as e: print(f"第{page}页请求失败: {e}") continue soup = BeautifulSoup(response.content, "lxml") # 正确使用类选择器获取所有房产项 property_items = soup.select(".ct-div-block.property-outer") # 遍历当前页的房产项,提取数据并追加到全局列表 for item in property_items: price = item.find("li", class_="ct-code-block property-price").get_text(strip=True) address = item.find("li", class_="ct-text-block property-name").get_text(strip=True) all_properties.append([price, address]) # 打印所有收集到的数据 for info in all_properties: print(info)
关键修改说明
- 新增
all_properties全局列表,用于存储所有页面的房产数据,每次遍历页面时向列表追加数据而非覆盖。 - 修正CSS选择器,确保能正确匹配到目标元素。
- 调整循环范围到
1,39,覆盖全部38页。 - 加入请求异常处理,避免单页请求失败导致整个程序崩溃。
- 使用
get_text(strip=True)去除文本中的多余空格和换行,让数据更整洁。
内容的提问来源于stack exchange,提问作者Zarathustra
相关产品推荐
相关产品推荐

