【问题标题】:Writing out results from python to csv file [UnicodeEncodeError: 'charmap' codec can't encode character将 python 的结果写入 csv 文件 [UnicodeEncodeError: 'charmap' codec can't encode character
【发布时间】:2019-03-10 13:22:30
【问题描述】:

我一直在尝试编写一个脚本,该脚本可能会从定义的 YouTube 视频的 cmets 部分刮取用户名列表,并将这些用户名粘贴到 .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)。

非常感谢, 谢尔盖。

【问题讨论】:

  • 无关 - 但你最终只会有一个名字。您会得到很多元素,并且对于每个元素,您都使用 'w' 重新打开一个文件(这将删除旧的)并在其中写入 smth,然后在下一轮被删除。使用'a' 甚至更好:打开文件一次,然后全部写入然后关闭它 - 这样它会更快,并且不必打开无数次来写入一些名称
  • Heya @PatrickArtner 非常感谢。我确实改变了那部分并制作了一个新的测试视频,其中包含我留下的三个 cmets,脚本有效,尽管并非完美无缺。它所做的是用逗号分隔用户名中的每个字符,并将它们作为单独的属性保存在 csv 中。虽然,如果不检查返回的数据类型(似乎是控制台中的普通文本),我似乎无法解决这个问题,但我确实找到了解决方法。我现在几乎可以肯定,这与 python 中的数据如何编码和写入 csv 有关。

标签: python python-3.x csv character-encoding python-unicode


【解决方案1】:

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)
    ...

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 2017-05-10
    • 2018-04-18
    • 2014-09-27
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2014-05-09
    相关资源
    最近更新 更多