将 BeautifulSoup 对象转换为字符串时如何避免 unicode 错误

How to escape a unicode error when converting a BeautifulSoup object to a string

我一直在使用以下代码,试图提取此网页的文本元素。

site= 'http://football.fantasysports.yahoo.com/f1/1785/4/team?&week=4'
print site
response = urllib2.urlopen(site)
html = response.read()

soup = BeautifulSoup(html)
position = soup.find_all('span', class_="Fz-xxs")
for j in range(0,13):
    positionlist = str(position[j].get_text())

print (positionlist)

不幸的是,被放入位置列表字符串中的文本本身包含许多无法编码的连字符(即:SEA-RB)。当我尝试按原样 运行 代码时,我得到以下响应:

Traceback (most recent call last):
  File "/Users/masongardner/Desktop/TestSorter.py", line 20, in <module>
    positionlist = str(position[j].get_text())
UnicodeEncodeError: 'ascii' codec can't encode character u'\ue002' in position 0: ordinal not in range(128)

我知道无法对连字符进行编码,但我不确定如何更改编码以便我可以让 unicode 在可能的情况下解释连字符,或者忽略连字符并仅对前后的文本进行编码对于每个实例。本项目纯属个人使用,黑客攻击不成问题!

谢谢大家!

不要尝试转换为 str 只需打印从 get_text:

获得的 unicode 字符串
site= 'http://football.fantasysports.yahoo.com/f1/1785/4/team?&week=4'

print site
response = urllib2.urlopen(site)
html = response.read()

soup = BeautifulSoup(html)
position = soup.find_all('span', class_="Fz-xxs")
for j in range(0,13):
    positionlist = (position[j].get_text()) # unicode string

    print (positionlist)
Viewing Info for League: The League (ID# 1785)
 # http://chars.suikawiki.org/char/E002




Since '08
Jax - QB

Atl - WR

Ten - WR

您看到的正是源代码中的内容 <span class="F-icon Fz-xxs">&#xe002;</span></a>

如果您想忽略该字符,请使用 if positionlist != u"\ue002":

你也可以使用unicodedata:

 import unicodedata
 print unicodedata.normalize('NFKD', positionlist).encode('ascii','ignore')

你也可以这样做

 try:
    print(word)
 except Exception: 
    print(str(word.encode("utf-8",'ignore')))

get_text()(顾名思义)已经returns一个文本——Unicode字符串。你不应该打电话给 str();你可以直接打印 Unicode 文本:

>>> str(u'\N{SNOWMAN}')                                                                                   
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2603' in position 0: ordinal not in range(128)
>>> print u'\N{SNOWMAN}'
☃

如果需要将Unicode字符串转为字节;调用 .encode() 方法(不要使用 str()):

bytestring = unicode_text.encode(character_encoding)

position[j].get_text() 实际上给你一个 'unicode' 输出你不能转换成 'str' 实际上是一个字节流没有指定编码采用。默认情况下,它假定您需要 ASCII,然后在发现不是 ASCII 的内容时抛出错误。

如果要打印到控制台,则无需转换为 str。 但很可能你想发送到某个地方所以提到编码,如果你不知道哪个坚持 UTF-8 因为大多数应用程序使用 UTF-8.Also 就像提到的检查如何忽略非 ASCII 字符。