基于Beautiful Soup的德国学校网站爬虫代码修正求助
修正后的爬虫脚本:提取德国学校数据并保存为CSV/Pandas DataFrame
先确保安装必要依赖:
pip install requests beautifulsoup4 pandas
以下是可以正常提取目标字段并保存数据的完整代码:
import requests from bs4 import BeautifulSoup import pandas as pd # 目标URL url = "https://schulen.bildung-rp.de" # 发送请求(模拟浏览器访问,避免被反爬拦截) headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) response.raise_for_status() # 检查请求是否成功 # 解析HTML soup = BeautifulSoup(response.text, "html.parser") # 定义要提取的字段 target_fields = [ "Kurzbezeichnung", "Schulnummer", "Anschrift", "Telefon", "Telefax", "E-Mail", "Internet", "Träger" ] # 存储所有学校数据的列表 school_data = [] # 定位每个学校的信息容器(根据页面实际结构调整,示例假设每个学校在class为"schul-item"的div中) school_containers = soup.find_all("div", class_="schul-item") for container in school_containers: school_info = {} # 遍历每个目标字段,提取对应内容 for field in target_fields: # 查找字段对应的标签(匹配包含字段名的label) label_element = container.find("label", string=lambda text: text and field in text) if label_element: # 获取字段值,处理标签嵌套情况 value_element = label_element.find_next_sibling() school_info[field] = value_element.get_text(strip=True) if value_element else "" else: # 字段不存在时留空 school_info[field] = "" school_data.append(school_info) # 转换为Pandas DataFrame df = pd.DataFrame(school_data) # 保存为CSV文件(用utf-8-sig编码避免德语特殊字符乱码) df.to_csv("de_schools_data.csv", index=False, encoding="utf-8-sig") print(f"成功提取{len(school_data)}条学校数据,已保存为de_schools_data.csv") print("DataFrame预览:") print(df.head())
关键修正点说明
- 反爬处理:添加
User-Agent模拟浏览器请求,避免网站拦截非浏览器请求。 - 空值容错:每个字段都做了存在性判断,即使页面中缺少某个字段,也不会报错,只会留空。
- 数据结构对齐:先将所有学校数据收集为字典列表,再统一转换为DataFrame和CSV,确保字段与列名完全匹配。
- 编码适配:保存CSV时使用
utf-8-sig编码,兼容德语特殊字符(如ä、ö、ü)。
注意事项
- 如果页面中学校信息的容器不是
div.schul-item,需要根据实际HTML结构调整school_containers的定位规则(比如改用table tr或其他标签/class)。 - 若
Internet字段是链接形式,可单独提取href属性:value_element.get("href", "")。
内容的提问来源于stack exchange,提问作者zero
相关产品推荐
相关产品推荐

