0

这是我很长一段时间以来第一次尝试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”编解码器无法在位置 139 编码字符“\u2026”:字符映射到

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

有人可以指出我正确的方向吗?

4

2 回答 2

0

您可能会在 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 发送的(推特模式或在 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 文档(查找“操作请求标头、代理等”部分)。

于 2013-09-21T11:00:24.357 回答
0

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

于 2013-09-04T02:31:28.153 回答