我在处理从不同网页(在不同网站上)获取的文本中的unicode字符时遇到问题.我正在使用BeautifulSoup.
问题是错误并不总是可重现的; 它有时适用于某些页面,有时候,它会通过抛出一个UnicodeEncodeError.我已经尝试了几乎所有我能想到的东西,但是我没有找到任何可以持续工作的东西而不会抛出某种与Unicode相关的错误.
导致问题的代码部分之一如下所示:
agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
Run Code Online (Sandbox Code Playgroud)
以下是运行上述代码段时在SOME字符串上生成的堆栈跟踪:
Traceback (most recent call last):
File "foobar.py", line 792, in <module>
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
我怀疑这是因为某些页面(或更具体地说,来自某些站点的页面)可能被编码,而其他页面可能是未编码的.所有这些网站都位于英国,并提供供英国消费的数据 - 因此,没有与内部化或处理用英语以外的任何文字处理的文本相关的问题.
有没有人有任何想法如何解决这个问题,以便我可以一致地解决这个问题?
as3:~/ngokevin-site# nano content/blog/20140114_test-chinese.mkd
as3:~/ngokevin-site# wok
Traceback (most recent call last):
File "/usr/local/bin/wok", line 4, in
Engine()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 104, in init
self.load_pages()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 238, in load_pages
p = Page.from_file(os.path.join(root, f), self.options, self, renderer)
File "/usr/local/lib/python2.7/site-packages/wok/page.py", line 111, in from_file
page.meta['content'] = page.renderer.render(page.original)
File "/usr/local/lib/python2.7/site-packages/wok/renderers.py", line 46, in render
return markdown(plain, Markdown.plugins)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 419, in markdown
return md.convert(text)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 281, in convert
source = unicode(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position …Run Code Online (Sandbox Code Playgroud) 我开始尝试使用python在sqlite中存储字符串,并得到消息:
sqlite3.ProgrammingError:除非使用可解释8位字节串的text_factory(如text_factory = str),否则不得使用8位字节串.强烈建议您只需将应用程序切换为Unicode字符串.
好的,我切换到Unicode字符串.然后我开始收到消息:
sqlite3.OperationalError:无法使用文本'SigurRós'解码为UTF-8列'tag_artist'
尝试从数据库中检索数据时.更多的研究和我开始在utf8编码,但随后'SigurRós'开始看起来像'SigurRós'
注意: @John Machin指出,我的控制台设置为'latin_1'显示.
是什么赋予了?在阅读完这篇文章后,描述了我所处的完全相同的情况,似乎建议忽略其他建议并且毕竟使用8位字节串.
在开始这个过程之前,我对unicode和utf了解不多.我在过去的几个小时里学到了很多东西,但我仍然不知道是否有办法正确地将'ó'从latin-1转换为utf-8而不是破坏它.如果没有,为什么sqlite'强烈推荐'我将我的应用程序切换到unicode字符串?
我将用最后24小时内学到的所有内容的摘要和一些示例代码来更新这个问题,以便我的鞋子里的人可以有一个简单的(呃)指南.如果我发布的信息有任何错误或误导,请告诉我,我会更新,或者你们中的一个高级人员可以更新.
答案摘要
让我首先说明我理解的目标.处理各种编码的目标,如果您尝试在它们之间进行转换,则要了解源编码是什么,然后使用该源编码将其转换为unicode,然后将其转换为所需的编码.Unicode是基础,编码是该基础的子集的映射.utf_8为unicode中的每个字符都有空间,但由于它们与例如latin_1不在同一个地方,因此以utf_8编码并发送到latin_1控制台的字符串将不会像您期望的那样.在python中,获取unicode和进入另一个编码的过程如下:
str.decode('source_encoding').encode('desired_encoding')
Run Code Online (Sandbox Code Playgroud)
或者如果str已经是unicode
str.encode('desired_encoding')
Run Code Online (Sandbox Code Playgroud)
对于sqlite我实际上并不想再次编码,我想解码它并保持unicode格式.当您尝试在python中使用unicode和编码时,您可能需要注意以下四件事.
阐述:
(1)当您从源读取字符串时,它必须具有一些编码,如latin_1或utf_8.在我的情况下,我从文件名中获取字符串,所以不幸的是,我可以获得任何类型的编码.Windows XP使用UCS-2(Unicode系统)作为其本机字符串类型,这似乎是在欺骗我.对我来说幸运的是,大多数文件名中的字符不会由多个源编码类型组成,我认为我的全部都是完全latin_1,完全是utf_8,或者只是简单的ascii(这是两者的子集)那些).所以我只是阅读它们并将它们解码,就像它们仍处于latin_1或utf_8一样.但是,有可能你可以将latin_1和utf_8以及在Windows上的文件名中混合在一起的任何其他字符.有时这些角色可以显示为框,有时它们看起来很糟糕,有时它们看起来是正确的(重音符号等等).继续.
(2)Python有一个默认的系统编码,在python启动时设置,在运行时不能更改.详情请见此处.脏的总结...这里是我添加的文件:
\# sitecustomize.py
\# this file can be anywhere in your Python path,
\# but it usually goes in ${pythondir}/lib/site-packages/
import sys
sys.setdefaultencoding('utf_8')
Run Code Online (Sandbox Code Playgroud)
此系统编码是在没有任何其他编码参数的情况下使用unicode("str")函数时使用的编码.换句话说,python试图根据默认的系统编码将"str"解码为unicode.
(3)如果您正在使用IDLE或命令行python,我认为您的控制台将根据默认的系统编码显示.我出于某种原因使用带有eclipse的pydev,所以我必须进入我的项目设置,编辑测试脚本的启动配置属性,转到Common选项卡,然后将控制台从latin-1更改为utf-8,以便我可以直观地确认我在做什么工作.
(4)如果你想要一些测试字符串,例如
test_str = "ó"
Run Code Online (Sandbox Code Playgroud)
在你的源代码中,你必须告诉python你在该文件中使用了什么样的编码.(仅供参考:当我输入错误编码时,我必须使用ctrl-Z,因为我的文件变得不可读.)这可以通过在源代码文件的顶部放置一行来实现:
# -*- coding: utf_8 -*-
Run Code Online (Sandbox Code Playgroud)
如果您没有此信息,python会尝试默认将您的代码解析为ascii,因此:
SyntaxError: Non-ASCII character '\xf3' in file _redacted_ on line 81, but no encoding declared; …Run Code Online (Sandbox Code Playgroud) 我的python(ver 2.7)脚本运行良好,从本地html文件中获取一些公司名称,但是当涉及到某个特定的国家/地区名称时,它会出现此错误"UnicodeEncodeError:'ascii'compodec无法编码字符"
当这个公司名称出现时特别收到错误
公司名称:KühlfixKälteanlagenIng.GerhardDoczekal&Co.KG
该链接无法处理
Traceback (most recent call last):
File "C:\Python27\Process2.py", line 261, in <module>
flog.write("\nCompany Name: "+str(pCompanyName))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 9: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
错误在这行代码中给出:
if companyAlreadyKnown == 0:
for hit in soup2.findAll("h1"):
print "Company Name: "+hit.text
pCompanyName = hit.text
flog.write("\nCompany Name: "+str(pCompanyName))
companyObj.setCompanyName(pCompanyName)
Run Code Online (Sandbox Code Playgroud) sys.setdefaultencoding('utf-8')在Python 2中存在令人沮丧的设置趋势.任何人都可以列出问题的真实例子吗?论证喜欢it is harmful或it hides bugs听起来不太令人信服.
更新:请注意,这个问题只是关于utf-8,它不是关于改变默认编码"一般情况下".
如果可以,请举一些代码示例.
我试图将整个段落输入到我的文字处理器中,先将其分成句子然后再分成单词.
我尝试了以下代码,但它不起作用,
#text is the paragraph input
sent_text = sent_tokenize(text)
tokenized_text = word_tokenize(sent_text.split)
tagged = nltk.pos_tag(tokenized_text)
print(tagged)
Run Code Online (Sandbox Code Playgroud)
但这不起作用,给我错误.那么如何将段落标记为句子然后单词呢?
一个示例段落:
这件事似乎压倒了这只小黑褐色的狗,使他受伤了.他在孩子脚下绝望地沉了下去.当重复一击,伴随着幼稚的句子中的警告,他转过身来,以一种特殊的方式握住他的爪子.在他的耳朵和眼睛的同时,他向孩子祈祷.
**警告:**这只是来自互联网的随机文本,我不拥有上述内容.
我已经阅读了关于Pandas'to_csv(......等等)的Python 2限制的内容.我打了吗?我在使用Python 2.7.3
当它们出现在字符串中时,这会产生≥和 - 的垃圾字符.除此之外,出口是完美的.
df.to_csv("file.csv", encoding="utf-8")
Run Code Online (Sandbox Code Playgroud)
有没有解决方法?
df.head()是这样的:
demography Adults ?49 yrs Adults 18?49 yrs at high risk|| \
state
Alabama 32.7 38.6
Alaska 31.2 33.2
Arizona 22.9 38.8
Arkansas 31.2 34.0
California 29.8 38.8
Run Code Online (Sandbox Code Playgroud)
csv输出就是这个
state, Adults ≥49 yrs, Adults 18−49 yrs at high risk||
0, Alabama, 32.7, 38.6
1, Alaska, 31.2, 33.2
2, Arizona, 22.9, 38.8
3, Arkansas,31.2, 34
4, California,29.8, 38.8
Run Code Online (Sandbox Code Playgroud)
整个代码是这样的:
import pandas
import xlrd
import csv
import json
df = pandas.DataFrame()
dy = …Run Code Online (Sandbox Code Playgroud) 我正在使用pyserial并需要发送一些小于255的值.如果我发送int本身,则发送int的ascii值.所以现在我将int转换为unicode值并通过串口发送.
unichr(numlessthan255);
However it throws this error:
'ascii' codec can't encode character u'\x9a' in position 24: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
什么是将int转换为unicode的最佳方法?
我正在处理python-lastfm库返回的unicode字符串.
我假设在某个地方,库得到编码错误并返回一个可能包含无效字符的unicode字符串.
例如,我期望变量a中的原始字符串是"Glück"
>>> a u'Gl\xfcck' >>> print a Traceback (most recent call last): File "", line 1, in UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 2: ordinal not in range(128)
\ xfc是转义值252,它对应于"ü"的latin1编码.不知怎的,它以一种python无法独立处理的方式嵌入到unicode字符串中.
如何将此转换为包含原始"Glück"的普通或unicode字符串?我尝试使用解码/编码方法,但要么得到了一个UnicodeEncodeError,要么是一个包含序列\ xfc的字符串.