如何使用BeautifulSoup解析非ASCII字符的HTML?

时间:2011-07-17 18:24:31

标签: python beautifulsoup

尝试使用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

UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128)

How do I convert a file's format from Unicode to ASCII using Python?

python UnicodeEncodeError > How can I simply remove troubling unicode characters?

UnicodeEncodeError: 'ascii' codec can't encode character u'\xef' in position 0: ordinal not in range(128)

2 个答案:

答案 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字符引用(&#174;)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快得多。