将Python的结果写入CSV文件时出现Unicode编码错误:'charmap'编解码器无法编码字符。

5

我一直在尝试编写一个脚本,可能会从指定的YouTube视频评论部分中爬取用户名列表,并将这些用户名粘贴到.csv文件中。

以下是脚本:

from selenium import webdriver
import time
import csv
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup as soup
driver=webdriver.Chrome()
driver.get('https://www.youtube.com/watch?v=VIDEOURL')
time.sleep(5)
driver.execute_script("window.scrollTo(0, 500)")
time.sleep(3)
html = driver.find_element_by_tag_name('html')
html.send_keys(Keys.END)
time.sleep(5)
scroll_time = 40
for num in range(0, scroll_time):
    html.send_keys(Keys.PAGE_DOWN)
for elem in driver.find_elements_by_xpath('//span[@class="style-scope ytd-comment-renderer"]'):
    print(elem.text)
    with open('usernames.csv', 'w') as f:
        p = csv.writer(f)
        p.writerows(str(elem.text));

它一直在抛出第19行的错误:
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u30b9' in position 0: character maps to <undefined>

我在这里看到,这可能与Windows控制台处理Unicode有关,并且看到一个潜在的解决方案是下载和安装Unicode库包,但那也没有帮助。

有人能帮助我弄清楚我做错了什么吗?

PS。我正在使用最新版本的Python(3.7)。

非常感谢, Sergej。


不相关 - 但最终你只会得到一个名称。你会得到很多元素,对于每个元素,你都会使用 'w' 打开一个文件(这将删除旧文件),并在其中写入一些内容,然后下一次循环时就会被删除。使用 'a' 或者更好的方法是:打开文件一次,然后写入所有内容,最后关闭它 - 这样速度更快,不需要打开无数次来写一些名称。 - Patrick Artner
嗨@PatrickArtner,非常感谢。我改变了那一部分,并发布了一个新的测试视频,其中包括我留下的三条评论,并且脚本起作用了,尽管不是完美无缺的。它所做的是,用逗号分隔了用户名中的每个字符,并将它们保存为csv中的单独属性。虽然我似乎不能在不检查返回的数据类型(看起来在控制台中是正常文本)的情况下修复它,但我找到了一个解决方法。我现在几乎确定这与python中的数据如何编码和写入csv有关。 - sergej.k
1个回答

11

将 Python 3 中的 str 值写入磁盘时需要将其编码为字节。如果文件没有指定编码,Python 将使用平台默认值。在这种情况下,缺省编码无法编码 '\u0389' ,因此会引发 UnicodeEncodeError

解决方案是在打开文件时指定编码为 UTF-8:

with open('usernames.csv', 'w', encoding='utf-8') as f:
    p = csv.writer(f)
    ...

由于UTF-8不是您平台的默认编码方式,因此需要在Python代码或Excel等应用程序中打开文件时指定编码方式。

Windows支持一种修改版的UTF-8编码方式,在Python中被命名为“utf-8-sig”。该编码方式会在文件开头插入三个字符,以便向Windows应用程序标识文件的编码方式,否则这些应用程序可能会尝试使用8位编码进行解码。如果文件仅在Windows机器上使用,则可能值得使用此编码方式。

with open('usernames.csv', 'w', encoding='utf-8-sig') as f:
    p = csv.writer(f)
    ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接