网页爬取:非表格数据转DataFrame及教育数据、贫困值问题
问题解答
1. 如何将网页爬取的非表格信息存入DataFrame?
核心是先把零散的爬取数据整理成结构化格式,再用Pandas转换为DataFrame,两种常用方法:
- 方法1:构造字典列表,每个字典对应一行数据
import pandas as pd # 爬取到的非表格零散数据 city_names = ["纽约", "洛杉矶", "芝加哥"] city_populations = [8336817, 3971883, 2693976] # 把数据映射为字典列表 data = [{"城市名称": name, "人口": pop} for name, pop in zip(city_names, city_populations)] # 转为DataFrame df = pd.DataFrame(data) - 方法2:直接用平行列表传入DataFrame构造器
df = pd.DataFrame({"城市名称": city_names, "人口": city_populations})
关键是先把非结构化的爬取结果(比如单个字符串、零散标签内容)对应到明确的列名和行记录。
2. 如何将教育信息整理为包含教育水平和百分比的DataFrame?
假设你爬取到的教育信息是类似["本科及以上: 35%", "高中/中专: 40%", "初中及以下: 25%"]的格式,处理步骤如下:
- 拆分每条信息,提取教育水平和百分比数值
- 整理为结构化数据后生成DataFrame
示例代码:
import pandas as pd # 爬取到的教育信息 edu_info = ["本科及以上: 35%", "高中/中专: 40%", "初中及以下: 25%"] # 拆分并清洗数据 processed_data = [] for item in edu_info: level, pct_str = item.split(": ") pct = float(pct_str.replace("%", "")) processed_data.append({"教育水平": level, "百分比": pct}) # 生成DataFrame edu_df = pd.DataFrame(processed_data)
如果爬取的是HTML标签(比如<span class="edu-level">本科及以上</span><span class="edu-pct">35%</span>),则先分别提取所有水平标签和百分比标签的文本,再按上述方式配对处理。
3. 提取贫困水平值时,转float提示无法转换列表的原因及解决方法
原因
你提取到的贫困水平值本身是列表类型,而非单个字符串或数值。常见场景:
- 用
BeautifulSoup.find_all()爬取时,返回的是所有匹配标签的列表(即使只有一个结果) - 数据嵌套,比如爬取结果是嵌套列表(如
["12.5%"])
解决方法
- 先确认变量类型:用
type(poverty_data)查看是否为列表 - 取列表中的单个元素(确保只有一个结果时),再清洗转换:
# 假设poverty_data是爬取到的列表,比如["12.5%"] poverty_str = poverty_data[0] # 提取单个元素 poverty_float = float(poverty_str.replace("%", ""))
- 如果列表有多个元素,需先判断是否需要全部处理,或检查爬取逻辑是否误匹配了多个标签
关于你的首个机器学习项目建议
用HRC城市平等指数做预测的思路完全可行,不用过度担心难度,按以下流程推进即可:
- 数据整理:把已评分城市的特征(人口、教育水平、贫困率、产业结构等)和平等指数整理为一个结构化数据集
- 数据清洗:处理缺失值(填充/删除)、编码分类变量(如城市所属州)、标准化数值特征
- 基线模型:先从简单模型入手(比如线性回归、决策树),跑通完整流程(拆分训练集/测试集、训练、评估),得到基准分数
- 迭代优化:再尝试复杂模型(随机森林、XGBoost),或加入特征工程(比如特征交叉、聚合统计)提升效果
首个项目重点在完整流程落地,不用追求极致性能,把数据处理、模型训练、评估的环节走通就是很大的进步。
内容的提问来源于stack exchange,提问作者Virtual Adept
相关产品推荐
相关产品推荐

