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

时间:2015-01-23 17:38:28

标签: python python-2.7 unicode-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)

不幸的是,放入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解释连字符,如果可能,或者忽略连字符,只需对每个连字符进行前后编码实例。这个项目纯粹是我自己使用的,所以一个黑客的方法不是问题!

谢谢大家!

4 个答案:

答案 0 :(得分:0)

不要试图转换为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')

答案 1 :(得分:0)

你也可以这样做

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

答案 2 :(得分:0)

get_text()(顾名思义)已经返回一个文本 - 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)

答案 3 :(得分:0)

position [j] .get_text()实际上为你提供了一个'unicode'输出,你无法转换为'str',它实际上是一个字节流而没有指定要使用的编码。默认情况下,它假定您需要ASCII,然后在找到非ASCII的时候会抛出错误。

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