如何使用Python提取InsideAirbnb指定年月的全部数据文件信息
解决代码
你原有代码的核心问题是日期转换函数逻辑写反,且没有处理日期列标注为N/A的行匹配逻辑,我们可以通过下载链接中自带的日期字段匹配这部分数据,完整修改后代码如下:
import requests import re from bs4 import BeautifulSoup from datetime import datetime DATASET_URL = "http://insideairbnb.com/get-the-data.html" DATASET_CITY = "Antwerp" # 目标是2021年8月,所以修改为08.2021 DATASET_MONTHYEAR = "08.2021" # 将页面格式的日期「27 August, 2021」转换为匹配用的「08.2021」格式 def date_str_to_monthyear(date_str): if date_str == 'N/A': return None dt = datetime.strptime(date_str, '%d %B, %Y') return dt.strftime('%m.%Y') # 从下载链接中提取日期信息,同时返回匹配用的年月格式 + 显示用的完整日期格式 def get_date_from_url(url): date_pat = re.search(r'/(\d{4}-\d{2}-\d{2})/', url) if not date_pat: return None, None date_obj = datetime.strptime(date_pat.group(1), '%Y-%m-%d') return date_obj.strftime('%m.%Y'), date_obj.strftime('%d %B, %Y') # 请求页面解析 r = requests.get(DATASET_URL) soup = BeautifulSoup(r.content, "html.parser") # 定位城市对应表格 city_table = soup.find(class_=DATASET_CITY.lower()) result_list = [] # 遍历表格所有行 for row in city_table.select('tbody tr'): tds = row.find_all('td') if len(tds) < 4: continue # 提取各字段原始内容 date_col_text = tds[0].get_text(strip=True) file_link = tds[2].find('a') download_url = file_link['href'] file_name = file_link.get_text(strip=True) file_desc = tds[3].get_text(strip=True) # 匹配目标年月 if date_col_text != 'N/A': cur_monthyear = date_str_to_monthyear(date_col_text) show_date = date_col_text else: cur_monthyear, show_date = get_date_from_url(download_url) if cur_monthyear == DATASET_MONTHYEAR: result_list.append([download_url, file_name, file_desc, show_date]) # 输出结果 print(result_list)
逻辑说明
- 日期列有明确日期的行,直接将日期转换为
mm.yyyy格式和目标匹配即可 - 日期列为
N/A的行,从下载链接中提取内置的yyyy-mm-dd格式日期,转换后匹配目标年月 - 所有匹配成功的行统一使用该月的完整日期作为返回的「对应日期」字段,符合你要求的输出格式
- 运行后
result_list就是你需要的列表结构,包含2021年8月的全部7条数据
内容的提问来源于stack exchange,提问作者Test
相关产品推荐
相关产品推荐

