Python 字符串处理、Unicode 和 Beautiful Soup
我一直在寻找解决我遇到的一个bug的方法,但一直没有找到或理解一个有效的解决方案。简单来说,当我使用字符串函数(比如translate、strip等)时,会出现Unicode错误(ascii编码无法处理字符'x',位置y:序号不在范围内(128))。但是,当我尝试用Beautiful Soup处理文本时,虽然没有出现Unicode错误,但对我来说难度(可以说是陌生感)还是挺高的。以下是我写的代码片段:
...
import urllib2,sys
import re
import os
import urllib
import string
import time
from BeautifulSoup import BeautifulSoup,NavigableString, SoupStrainer
from string import maketrans
import codecs
trantab=string.maketrans(",",";")
...
html5 = urllib2.urlopen(address5).read()
time.sleep(1.5)
soup5 = BeautifulSoup(html5)
for company in iter(soup5.findAll(height="20px")):
stream = ""
count_detail = 1
for tag in iter(company.findAll('td')):
if count_detail > 1:
stream = stream + string.translate(str(tag.text),trantab)
if count_detail < 4 :
stream=stream+","
count_detail = count_detail + 1
print str(storenum)+","+branch_name_address+","+ stream
....
这个脚本运行了一段时间,然后在stream = stream + string.translate(str(tag.text),trantab)
这一行出错了。
基本上,我只是想把我处理的字段中的逗号替换成分号。
另外,我还试图用string.strip
来去掉多余的空格,但也遇到了类似的错误。
我该如何使用Beautiful Soup来做同样的事情(也就是把逗号替换成分号和去掉空格)呢?
或者,如果我继续使用字符串函数,有没有代码可以解决那些烦人的Unicode错误?
1 个回答
5
你在使用 str
对象和 unicode
对象时搞混了,这会导致 Python 解释器把其中一个转换成另一个。字符串和 Unicode 之间的转换需要一个编码,默认情况下假设是 ascii 编码。当这个假设不成立时,就会出现这种错误。
一般来说,解决这个问题的方法是不要把 str
和 unicode
混在一起:尽量在所有地方使用 unicode,并且在进行转换时要明确使用 string.encode('utf8', 'strict')
和 unicode_string.decode('utf8', 'strict')
(UTF-8 是一种编码方式的例子)。
在这种情况下,把
stream = stream + string.translate(str(tag.text),trantab)
替换为
stream = stream + tag.text.replace(u',', u';')