我尝试使用python和以下脚本将html table解析为csv:
from bs4 import BeautifulSoup
import requests
import csv
csvFile = open('log.csv', 'w', newline='')
writer = csv.writer(csvFile)
def parse():
html = requests.get('https://en.wikipedia.org/wiki/Comparison_of_text_editors')
bs = BeautifulSoup(html.text, 'lxml')
table = bs.select_one('table.wikitable')
rows = table.select('tr')
for row in rows:
csvRow = []
for cell in row.findAll(['th', 'td']):
csvRow.append(cell.getText())
writer.writerow(csvRow)
print(csvRow)
parse()
csvFile.close()
此代码输出的是格式清晰的CSV文件,没有编码问题。
在EnricoTröger的Geany之前一切都很好。我的脚本无法编写ö
到一个csv文件中,所以我尝试了这个:
csvRow.append(cell.text.encode('ascii', 'replace'))
代替:csvRow.append(cell.getText())
尽管每个表单元格都嵌套在b''
中,但一切都很好。 因此,我如何获得格式清晰的csv文件,该文件带有很多编码问题(如第一个屏幕截图所示),并且全部替换或忽略了
非密码符号(如第二个屏幕截图所示)使用我的密码?
答案 0 :(得分:6)
更改此内容
csvFile = open('log.csv', 'w', newline='')
对此:
csvFile = open('log.csv', 'w', newline='', encoding='utf8')
由于使用
open()
打开了CSV文件以进行读取,因此默认情况下,将使用系统默认编码将文件解码为unicode(请参见locale.getpreferredencoding()
)。要使用其他编码对文件进行解码,请使用open的encoding参数:import csv with open('some.csv', newline='', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: print(row)
这同样适用于写入系统默认编码以外的内容:打开输出文件时指定编码参数。
我想您的系统默认编码不是utf8
。
您可以像这样检查它:
import locale
locale.getpreferredencoding()
希望有帮助!
答案 1 :(得分:1)
好像csv模块需要字符串,而不是bytes
。因此,您可以在传递bytes
之前对它们进行解编码:
cell.text.encode('ascii', 'replace').decode('ascii')