【问题标题】:python3 encode errors, confusion (using twython)python3编码错误,混淆(使用twython)
【发布时间】:2013-09-21 19:00:24
【问题描述】:

这是我很长时间以来第一次尝试 python。我正在尝试使用 twython 简单地提取和打印推文到控制台。

tw = Twython(APP_KEY, access_token=access_token)
search = tw.search(q='#python')
for tweet in search["statuses"]:
    print(tweet['user']['name'])
    print(tweet['text'])

通常会打印几条推文,然后我遇到了这个问题,同时打印用户名或推文文本(取决于字符出现的位置):

UnicodeEncodeError: 'charmap' 编解码器无法在位置编码字符 '\u2026' 139:字符映射到

我尝试添加.encode('utf-8') 或将其包装在str() 中,但我将得到最接近的是b'text here',但显然我只想要推文文本。甚至尝试使用decode()。我读到我必须告诉 python 我想编码什么样的字符集,我一直在这样做,但我仍然得到b'string here'。我在网上找到的很多示例都不适用于 python3,这也使得找到我需要的东西变得更加困难。

有人能指出正确的方向吗?

【问题讨论】:

  • 将编码字节发送到标准输出?这是唯一的方法吗?我可以全部打印出来,现在只需要换行即可

标签: python utf-8 twython


【解决方案1】:

您的控制台使用的字符集是什么?我假设它是ascii。 '\u2026' 在 utf-8 中是合法字符,但在 ascii 中是非法的。
当您打印字符串时,python 将尝试使用控制台的默认字符集对其进行编码,因为字符串在内部存储为 unicode 序列。如果默认字符集不支持字符串中的某些字符,则会出现您遇到的那种错误。
您可以将您的语言环境语言更改为 utf-8 并再次运行您的脚本,顺便说一句,unicode 字符“\u2026”显示为“...”。

【讨论】:

    【解决方案2】:

    您可能会在 Twitter API 处理使用 UTF-8 字符的字符计数的方式上找到此页面,该页面有助于解释为什么某些 UTF-8 字符可以在推文结尾使用而其他字符不会:

    https://dev.twitter.com/docs/counting-characters

    至于您的实际问题,请将以下 client_args 定义插入您的代码:

    from twython import Twython
    
    APP_KEY = "key"
    APP_SECRET = "key-secret"
    OAUTH_TOKEN = "token"
    OAUTH_TOKEN_SECRET = "secret"
    
    client_args = {
      "headers": {
        "accept-charset": "utf-8"
      }
    }
    
    twitter = Twython(APP_KEY, APP_SECRET, OAUTH_TOKEN, OAUTH_TOKEN_SECRET)
    

    这应该告诉 Twitter API 接受来自您的应用程序的 UTF-8 字符。然后你只需要确保你的脚本/代码和它的所有接口也接受 UTF-8。然后,您需要做的就是创建您在输入推文或 DM 并发送时所追求的角色。

    如果上面的 client_args 设置没有在 shell 和其他程序中指定你的字符集,它可能需要在传输的特定标头中进行调整。例如,您可能会发现“content-type”是一个更好的设置或需要包含它的标头(尽管它不应该是)。

    我的大部分推文都是通过 Emacs 发送的(Twittering 模式或在 Emacs 缓冲区中调用 Twython 脚本的 shell),发送全范围的 UTF-8 字符(最高 Unicode 5.1 或 5.2)没有问题,我想想。

    我实际上不需要为我的脚本设置自定义标头,但那是因为 UTF-8 是我对以下所有内容的默认字符集:Emacs、bash (shells)、Firefox、Thunderbird、GPG(最后一个不影响 Twitter,但总是值得鼓励使用),最后是 Twitter API 本身。如果我还没有将所有其他的东西都设置为默认使用 UTF-8,那么我几乎肯定会通过 shell 脚本和其他地方遇到 Unicode 问题。

    最后,如果您发现大多数 UTF-8 字符可以通过您的脚本发送,但一些(通常不太常见或相对较新的)字符不能,那么原因很可能是由于您支持的 Unicode 版本操作系统和/或可用的字符集(字体)。如果您遇到这个问题,那么您将遇到真正的麻烦,因为即使您设法将正确的字符传输到 Twitter,您的计算机也无法显示它。另一方面,如果你达到了这一点,你至少会看到你的一些推文,并且错误消息将停止。

    Python 请求文档和 Twython 文档提供了有关发送(发布)自定义标头的格式的更多详细信息,并且 Wikipedia 包含标头类型列表。

    维基百科列表在这里:

    https://en.wikipedia.org/wiki/List_of_HTTP_header_fields

    不幸的是,我的堆栈帐户最近才被激活,所以我无法链接所有有用的东西。您可能需要查看请求文档(查找“更复杂的 POST 请求”部分)和 Twython 文档(查找“操作请求标头、代理等”部分)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      相关资源
      最近更新 更多