我一直在使用以下代码,尝试提取此网页的文本元素。
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解释连字符,如果可能,或者忽略连字符,只需对每个连字符进行前后编码实例。这个项目纯粹是我自己使用的,所以一个黑客的方法不是问题!
谢谢大家!
答案 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"></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字符。