将 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"></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 字符。
我一直在使用以下代码,试图提取此网页的文本元素。
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
:
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"></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 字符。