尝试使用BeautifulSoup解析一些html时,我一直收到以下错误:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xae in position 0: ordinal not in range(128)
我尝试使用以下问题的解决方案解码html,但不断收到相同的错误。我已经尝试了以下问题的所有解决方案,但它们都没有工作(发布以便我不会得到重复的答案,以防他们通过查看问题的相关方法帮助任何人找到解决方案)。
有人知道我在哪里错了吗?这是BeautifulSoup中的错误,我应该安装早期版本吗?
编辑:下面的代码和追溯:
from BeautifulSoup import BeautifulSoup as bs
soup = bs(html)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 1282, in __init__
BeautifulStoneSoup.__init__(self, *args, **kwargs)
File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 946, in __init__
self._feed()
File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 971, in _feed
SGMLParser.feed(self, markup)
File "/usr/lib/python2.5/sgmllib.py", line 99, in feed
self.goahead(0)
File "/usr/lib/python2.5/sgmllib.py", line 133, in goahead
k = self.parse_starttag(i)
File "/usr/lib/python2.5/sgmllib.py", line 285, in parse_starttag
self._convert_ref, attrvalue)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xae in position 0: ordinal not in range(128)
编辑:以下评论中的错误消息:
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 1282, in __init__
BeautifulStoneSoup.__init__(self, *args, **kwargs)
File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 946, in __init__
self._feed()
File "/var/lib/python-support/python2.5/BeautifulSoup.py", line 971, in _feed
SGMLParser.feed(self, markup)
File "/usr/lib/python2.5/sgmllib.py", line 99, in feed
self.goahead(0)
File "/usr/lib/python2.5/sgmllib.py", line 133, in goahead
k = self.parse_starttag(i)
File "/usr/lib/python2.5/sgmllib.py", line 285, in parse_starttag
self._convert_ref, attrvalue)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xae in position 0: ordinal not in range(128)
感谢您的帮助!
'ascii' codec error in beautifulsoup
How do I convert a file's format from Unicode to ASCII using Python?
python UnicodeEncodeError > How can I simply remove troubling unicode characters?
答案 0 :(得分:2)
你在评论中说:“”我只是查看我试图解析的html的内容类型,看看它是否是我没试过的东西(之前我只是假设它是UTF-8 )但确定它是UTF-8所以另一个死胡同。“”“
叹息。这正是我试图让您泄露您要解析的HTML的原因。错误消息表明(第一个)问题字节是\xae
,它绝对不是UTF-8序列中的有效前导字节。
要么泄露HTML链接,要么做一些基本的调试:
uc = html.decode('utf8')
是否有效?如果失败,有什么错误信息?
你还说:“”“我开始认为这是BS中的一个错误,他们在文档中提到了这个错误,可以在这里看到:crummy.com/software/BeautifulSoup/CHANGELOG.html。” “”
我无法想象您所指的更改日志中的哪些模糊条目。在急于更新之前,请考虑调试问题。
更新在sgmllib.py中看起来像一个模糊的错误。在第394行中,将255更改为127,它似乎正常工作。转角案例:属性值为AND的HTML字符引用(®
)AND&lt; = ordinal&lt; 255。
进一步的评论而不是破解你的sgmllib.py副本,从2.7分支中获取最新的sgmllib.py副本 - BS 3.0.4在Python 2.7.1上为我运行了OK 。更好的是,将Python升级到2.7。
答案 1 :(得分:2)
我尝试在html上使用pyquery,结果很好。
import urllib
from pyquery import PyQuery
html = urllib.urlopen('http://www.6pm.com/onitsuka-tiger-by-asics-ultimate-81').read()
pq = PyQuery(html)
print pq('span#price').text() # "$39.00 40% off MSRP $65.00"
pyquery基于lxml,所以它也比beautifulsoup快得多。