UnicodeEncodeError:处理特殊字符

时间:2015-04-05 09:34:11

标签: python python-3.x unicode web-scraping python-unicode

我正在尝试废弃网页。为了保持除ASCII以外的所有字符,我已经编写了这段代码。

    mydata = ''.join([i if ord(i) < 128 else ' ' for i in response.text])

使用美丽的汤蟒蛇库进一步加工。现在这不是处理网页上的一些特殊字符,如[tick],[star](这里不能显示图片)。 有关如何转义这些字符并用空格替换它们的任何线索。 现在我有这个错误

    UnicodeEncodeError: 'charmap' codec can't encode character '\u2713' in position 62: character maps to <undefined>

3 个答案:

答案 0 :(得分:2)

fp = open("output.txt","w")

为您提供一个文件,用于使用默认编码打开文本,在您的情况下,这是一个没有字符(可能是cp1252)的编码,因此出错。使用支持它的编码打开文件,你会没事的:

fp = open('output.txt', 'w', encoding='utf-8')

另请注意:

print("result: "+ str(ele))
如果您的控制台不支持Unicode,

可能会失败,在Windows下它可能不会。使用print(ascii(...))获取ASCII安全表示以进行调试。

您尝试摆脱非ASCII字符失败的可能原因是您在解析HTML之前将其删除,而不是从解析后获得的值中删除它们。因此,文字将被删除,但如果使用了&#x2713;之类的字符引用,它将保持不变,由bs4解析,最终为

(我很遗憾,对Unicode错误的默认反应似乎总是试图完全摆脱非ASCII字符,而不是修复代码以正确处理它们。)

您还以非常奇怪的方式提取文本,使用str()获取标记,然后尝试挑选标记并将其删除。这是不可靠的 - HTML并不是那么容易解析,这就是为什么BeautifulSoup是一个东西 - 而且是不必要的,因为你已经拥有了一个非常好的HTML解析器,它可以为你提供元素中的纯文本(get_text())。 / p>

答案 1 :(得分:0)

始终最好以Unicode格式处理所有内容,并仅在存储或传输之前转换为任何特定编码。例如,

  

s = u“嗨,привет,ciao”

> s
u'Hi, \u043f\u0440\u0438\u0432\u0435\u0442, ciao'

> s.encode('ascii', 'ignore')
'Hi, , ciao'

> s.encode('ascii', 'replace')
'Hi, ??????, ciao'

如果您需要专门用空格替换非ascii字符,您可以编写并注册自己的转换错误处理程序,请参阅codecs.register_error()

答案 2 :(得分:0)

您的大部分代码都不是必需的。请求已经为你做了正确的解码,beautifulsoup正在为你做文本提取,python正在为你写一个正确的编码:

import requests
from bs4 import BeautifulSoup

#keyterm = input("Enter a keyword to search:")
URL = 'https://www.google.com/search?q=jaguar&num=30'
#NO_OF_LINKS_TO_BE_EXTRACTED = 10
print("Requesting data from %s" % URL)
response = requests.get(URL)
soup = BeautifulSoup(response.text)

#print(soup.prettify())
metaM = soup.findAll("span","st")
#metaM = soup.find("div", { "class" : "f slp" })
with open("output.txt", "w", encoding='utf8') as fp:
    for ele in metaM:
        print("result: %r" % ele)
        fp.write(ele.get_text().replace('\n', ' ') + '\n')