You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BeautifulSoup网页爬取异常:数据仅显示单列,zip_longest未解决问题

网页爬取CSV导出列异常问题解决

问题描述

使用BeautifulSoup爬取网页后,导出的CSV文件所有数据挤在一列,未按预期分配到对应列。已尝试使用zip_longest和解包操作实现标题对应列、详情按行匹配,但问题仍未解决。

代码如下:

import requests
from bs4 import BeautifulSoup
import csv
from itertools import zip_longest

job_title = []
company_name = []
location_name = []
skills = []

#2 use requests to fetch the url
result = requests.get ("https://wuzzuf.net/search/jobs/?q=programmer&a=hpb")

#3 save page content/markup
src = result.content

#4 create soup object to parse content
soup = BeautifulSoup (src, "lxml")

#5 find the elements containing info we need 
#-- job titles, job skills, company names, location names 

job_titles = soup.find_all("h2",{"class":"css-m604qf"})
company_names = soup.find_all("a",{"class":"css-17s97q8"})
locations_names = soup.find_all("span",{"class":"css-5wys0k"})
job_skills = soup.find_all("div",{"class":"css-y4udm8"})

#6 loop over returned lists to extract needed info other lists

for i in range(len(job_titles)):
    job_title.append(job_titles[i].text)
    company_name.append(company_names[i].text)
    location_name.append(locations_names[i].text)
    skills.append(job_skills[i].text)

#7 create csv file and fill it with values
file_list = [job_title, company_name, location_name, skills]
exported = zip_longest(*file_list)

with open("job.csv", "w" ) as myfile:
    wr = csv.writer(myfile)
    wr.writerow(["job title", "company name", "location", "skills"])
    wr.writerows(exported)

问题原因与解决方法

核心问题

CSV数据挤在一列的主要原因是文件编码未适配Windows环境,默认编码下Excel等工具无法正确识别列分隔符;其次是爬取的文本包含换行、多余空格等特殊字符,干扰CSV的行结构。

修正后的代码

import requests
from bs4 import BeautifulSoup
import csv
from itertools import zip_longest

job_title = []
company_name = []
location_name = []
skills = []

# 请求网页
result = requests.get("https://wuzzuf.net/search/jobs/?q=programmer&a=hpb")
src = result.content
soup = BeautifulSoup(src, "lxml")

# 定位元素(简化class写法)
job_titles = soup.find_all("h2", class_="css-m604qf")
company_names = soup.find_all("a", class_="css-17s97q8")
locations_names = soup.find_all("span", class_="css-5wys0k")
job_skills = soup.find_all("div", class_="css-y4udm8")

# 提取并清洗数据
for i in range(len(job_titles)):
    job_title.append(job_titles[i].text.strip())
    company_name.append(company_names[i].text.strip())
    location_name.append(locations_names[i].text.strip())
    # 替换技能文本中的换行符,避免破坏CSV行结构
    skills.append(job_skills[i].text.replace("\n", " ").strip())

# 导出CSV
file_list = [job_title, company_name, location_name, skills]
exported = zip_longest(*file_list)

# 指定UTF-8带BOM编码+控制换行符,解决列错位和空行问题
with open("job.csv", "w", encoding="utf-8-sig", newline="") as myfile:
    wr = csv.writer(myfile)
    wr.writerow(["job title", "company name", "location", "skills"])
    wr.writerows(exported)

关键改动说明

  • 编码适配:使用encoding="utf-8-sig"生成带BOM的UTF-8文件,确保Windows平台的表格工具能正确识别列分隔符,避免所有数据挤在一列。
  • 文本清洗:通过.strip()去除文本首尾空格,用.replace("\n", " ")替换技能文本中的换行符,防止特殊字符破坏CSV的行结构。
  • 换行符控制:添加newline=""参数,让csv.writer自动处理换行逻辑,避免Windows下导出的CSV出现多余空行。

额外优化建议

如果爬取的文本包含大量逗号,可以在初始化csv.writer时指定制表符作为分隔符,进一步避免列错位:

wr = csv.writer(myfile, delimiter="\t")

内容的提问来源于stack exchange,提问作者Lpython

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:58:16