python解析网页获取的数据如何去掉其中的空行ValueError: arrays must all be same length

今天做了一个python的一个比较小的实战案例:基于链家网二手房数据解析网页并从中获取如下信息:

  1. 标题
  2. 位置
  3. 房屋信息
  4. 关注人数 / 发布时间
  5. 房屋总价
  6. 房屋单价
  7. 备注信息

最后调用函数的时候报错ValueError: arrays must all be same length
如下面的两张图:
在这里插入图片描述
在这里插入图片描述
原来查看了一下他们的数据长度,发现有的数据长度为30,有的数据长度为60,如下图所示:
在这里插入图片描述
查看其中60的数据中,发现是空格和空行占据了1/2,如下图所示:
在这里插入图片描述
初步解决消除空格和空行的两种方法:

#写法一: 
#house_info_2 = [] 
#for i in house_info: 
#    house_info_2.append(re.sub('\s', '', i)) 
#写成如下形式:
house_info = html.xpath('//div[@class="info clear"]//div[@class="houseInfo"]/text()').extract() 
for i in house_info: 
    house_info.append(re.sub('\s', '', i))

#写法二:
#house_info_2 = [re.sub('\s', '', i) for i in house_info] 
#写成如下形式:
house_info1 = html.xpath('//div[@class="info clear"]//div[@class="houseInfo"]/text()').extract() 
house_info = [re.sub('\s', '', i) for i in house_info1] 
house_info

这种方法虽然把空格去掉了,但是有单引号单独占有的空行,长度仍为60,而其他数据的获取长度均为30
如下图所示:
在这里插入图片描述
再次进行修改:

#第一种——获取房屋信息
house_info = [re.sub('\s', '', i) for i in html.xpath('//li[@class="clear"]//div[@class="houseInfo"]/text()[2]').extract()]
print(len(house_info))

#第二种——获取房屋信息
house_info = [re.search(r'houseIcon"></span>(.*?)</div>', i, re.S).group(1)
              for i 
在你的代码中出现 `ValueError: arrays must all be same length` 错误,通常是因为你在使用 `pandas` 的 `DataFrame` 构造函数或 `pd.concat()`、`DataFrame.join()` 等操作时,传入了长度不一致的数组或 Series。 --- ### 常见原因分析 1. **DataFrame构造时列长度不一致** ```python pd.DataFrame({'col1': [1, 2], 'col2': [1, 2, 3]}) ``` 2. **DataFrame合并时索引不一致** ```python df1 = pd.DataFrame({'A': [1, 2]}, index=[0, 1]) df2 = pd.DataFrame({'B': [3, 4]}, index=[1, 2]) df1.join(df2) # 如果没有正确对齐索引,可能出错 ``` 3. **使用`join`或`concat`时未对齐索引** - `join`默认是按索引合并,如果索引不一致,可能导致长度不一致。 4. **one-hot编码时原始数据被过滤,但编码列未同步更新** --- ### 在你的代码中,可能出错的位置是: ```python for col, num in multiselect_cols.items(): temp_df = process_multiselect_column(data_clean, col, num) binary_columns_all = binary_columns_all.join(temp_df, how='left') ``` 这里的问题在于: - `process_multiselect_column()` 返回的 `temp_df` 是基于 `data_clean` 的完整索引创建的。 - 如果 `data_clean` 在之后被过滤(如 `data_clean = data_clean[...]`),而 `binary_columns_all` 未同步更新索引,就会导致长度不一致。 --- ### 解决方案 #### ✅ 方法一:确保合并时使用相同的索引(推荐) 在你做完所有数据清洗操作后(如过滤`user_id`),再执行 one-hot 编码操作。 ```python # 先做完所有过滤操作 data_clean = data_clean[data_clean['user_id'].str.contains(r'[A-Za-z]', na=False)] # 然后再初始化 binary_columns_all binary_columns_all = pd.DataFrame(index=data_clean.index) # 再进行 one-hot 编码和合并 for col, num in multiselect_cols.items(): temp_df = process_multiselect_column(data_clean, col, num) binary_columns_all = binary_columns_all.join(temp_df, how='left') # 合并回原始数据 data_clean = pd.concat([data_clean, binary_columns_all], axis=1) ``` --- #### ✅ 方法二:使用 `reindex` 保证索引一致 如果你必须在过滤之前做编码,可以在合并时使用 `reindex`: ```python binary_columns_all = binary_columns_all.reindex(data_clean.index) ``` --- #### ✅ 方法三:使用 `pd.concat` 替代 `join`,并设置 `axis=1` ```python data_clean = pd.concat([data_clean, binary_columns_all], axis=1) ``` --- ### 示例代码(完整修复 one-hot 编码部分): ```python # 先做完所有数据清洗 data_clean = data_clean[data_clean['user_id'].str.contains(r'[A-Za-z]', na=False)] # 初始化 one-hot 编码的 DataFrame binary_columns_all = pd.DataFrame(index=data_clean.index) # 开始处理多选列 for col, num in multiselect_cols.items(): temp_df = process_multiselect_column(data_clean, col, num) binary_columns_all = binary_columns_all.join(temp_df, how='left') # 合并回原始数据 data_clean = pd.concat([data_clean, binary_columns_all], axis=1) ``` --- ### 总结 | 原因 | 解决方法 | |------|----------| | 数据过滤后未重新对齐编码列 | 在过滤后再进行 one-hot 编码 | | 使用 `join` 时索引不一致 | 使用 `reindex()` 或 `pd.concat(..., axis=1)` | | 构造 DataFrame 时长度不一致 | 检查列的长度是否一致 | --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值