基于BS4类名判断赋值并导出CSV的爬取问题
解决方法:修正类名判断逻辑与数据结构
首先,你的代码核心问题有两个:
- 类名判断错误:你在判断
line['class'][0],但目标span的class列表第一个元素是glyphicon,而不是完整的glyphicon glyphicon-ok text-success(这个属性值拆分后是三个独立类:glyphicon、glyphicon-ok、text-success),所以你的条件永远不会触发。 - 重复添加字典到列表:在循环span时你重复调用
quotes.append(quote),会导致同一个quote被多次添加到列表,最终CSV数据重复且混乱。
修正后的完整代码
import requests from bs4 import BeautifulSoup import csv URL = "https://database.globalreporting.org/reports/49283/" # 建议去掉verify=False,或者添加证书验证,避免安全风险 r = requests.get(URL, verify=False) soup = BeautifulSoup(r.content, 'html5lib') table = soup.findAll('li', attrs={'class': 'list-group-item'}) quotes = [] for row in table: quote = { 'Label': "", 'Tickmark': "", 'Cross': "" } # 处理Label文本,去除多余空格 quote['Label'] = " ".join(row.getText().split()) # 精准查找当前row里的目标span元素 tick_span = row.find('span', class_='text-success') cross_span = row.find('span', class_='text-light') if tick_span: quote['Tickmark'] = "Yes" if cross_span: quote['Cross'] = "No" # 每个row只添加一次quote到列表 quotes.append(quote) # 导出CSV,优化格式避免乱码和空行 filename = 'CSR_Info.csv' with open(filename, 'w', newline='', encoding='utf-8') as f: w = csv.DictWriter(f, ['Label','Tickmark','Cross']) w.writeheader() for quote in quotes: w.writerow(quote)
关键改动说明
精准定位span元素:
- 使用
row.find('span', class_='text-success')直接查找带有text-success类的span(勾图标的标识类) - 使用
row.find('span', class_='text-light')查找叉图标对应的span
这种方式比遍历所有span再判断更简洁高效。
- 使用
初始化字典字段:
提前给Tickmark和Cross设为空字符串,确保导出CSV时即使没有对应值也会保留列的位置,不会出现错位。避免重复添加数据:
每个row对应的quote只在处理完所有逻辑后添加一次到quotes列表,保证数据唯一且有序。优化CSV写入:
添加newline=''避免Windows系统下CSV出现空行,指定encoding='utf-8'防止潜在的字符乱码问题。
这样修改后,就能正确识别勾和叉的标识,导出的CSV会呈现你期望的格式:比如Integrated:,Yes, 或者Integrated:,,No。
内容的提问来源于stack exchange,提问作者Florian Schramm
相关产品推荐
相关产品推荐

