Python爬取的网页数据如何按要求格式写入CSV对应列
爬虫脚本修复方案
问题根因
你当前的代码是分别遍历containers(集合名称列表)和numbers(数值列表)逐行写入,所有集合名称写完才会写入数值内容,自然会出现列错位的问题。观察你给出的输出可以发现,每3个numbers元素刚好对应1个集合的Homesites、Bedrooms、Price Range三个属性,只要把两个列表按行匹配写入即可。
另外直接手动拼接CSV内容容易遇到字段含逗号、空格的解析问题,推荐使用Python自带的csv模块处理写入逻辑,更稳妥。
修复后完整代码
from urllib.request import urlopen as uReq from bs4 import BeautifulSoup as soup import csv my_url = 'https://www.lennar.com/new-homes/california/sacramento/el-dorado-hills/heritage-el-dorado-hills' uClient = uReq(my_url) page_html = uClient.read() uClient.close() page_soup = soup(page_html, 'html.parser') containers = page_soup.findAll('div', {'class':'GridItem_container__5PgVU GridItem_item-start-1__1YuAr GridItem_item-span-11__2CVRN GridItem_item-start-md-7__2IvNK GridItem_item-span-md-5__xZ-1p GridItem_item-start-lg-13__2IVYX GridItem_item-span-lg-9__1sQmg GridItem_item-row-2__-d6T5 GridItem_item-row-md-1__20GIi'}) numbers = page_soup.findAll('p', {'class':'Typography_headline3__2nuPh'}) # 先提取所有数值的文本内容,按3个一组分组,每组对应一个集合的三个属性 num_list = [num.text.strip() for num in numbers] # 每3个元素分为一组 num_groups = [num_list[i:i+3] for i in range(0, len(num_list), 3)] filename = 'product.csv' # 使用csv模块写入,自动处理分隔符转义 with open(filename, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) # 写入表头 writer.writerow(['Collection', 'Homesites', 'Bedrooms', 'Price Range']) # 同时遍历集合名和对应的数值组 for collection_container, num_group in zip(containers, num_groups): collection_name = collection_container.p.text.strip() # 按顺序拼接四个字段写入一行 writer.writerow([collection_name] + num_group)
改动说明
- 新增
num_groups对数值列表按3个元素分组,和集合列表一一对应 - 替换原生文件写入为
csv模块写入,避免CSV格式错误 - 使用
zip同时遍历两个列表,保证每行的四个字段对应正确 - 新增
strip()处理文本首尾多余空格,避免数据冗余
内容的提问来源于stack exchange,提问作者Phong Le
相关产品推荐
相关产品推荐

