Python 字符串处理、Unicode 和 Beautiful Soup

2 投票
1 回答
2876 浏览
提问于 2025-04-16 12:22

我一直在寻找解决我遇到的一个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 编码。当这个假设不成立时,就会出现这种错误。

一般来说,解决这个问题的方法是不要把 strunicode 混在一起:尽量在所有地方使用 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';')

撰写回答