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

Python 如何使用BeautifulSoup解析带有非ASCII字符的HTML?,python,beautifulsoup,Python,Beautifulsoup,在尝试使用BeautifulSoup解析某些html时,我不断遇到以下错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xae in position 0: ordinal not in range(128) 我已经尝试使用下面问题的解决方案来解码html,但仍然会出现相同的错误。我已经尝试了下面问题的所有解决方案,但没有一个有效(张贴,这样我就不会得到重复的答案,以防他们通过查看问题的相关方法帮助任何人找到解决方案) 有人知道我

在尝试使用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)
从BeautifulSoup导入BeautifulSoup作为bs
soup=bs(html)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/var/lib/python-support/python2.5/BeautifulSoup.py”,第1282行,在__
美化ToneSoop.uuu初始_uuuu(self,*args,**kwargs)
文件“/var/lib/python-support/python2.5/BeautifulSoup.py”,第946行,在__
self._feed()
文件“/var/lib/python support/python2.5/BeautifulSoup.py”,第971行,在_提要中
SGMLParser.feed(self,markup)
文件“/usr/lib/python2.5/sgmllib.py”,第99行,在提要中
自我激励(0)
goahead中的文件“/usr/lib/python2.5/sgmllib.py”,第133行
k=自我分析(i)
文件“/usr/lib/python2.5/sgmllib.py”,第285行,在parse_starttag中
self.\u convert\u ref,attrvalue)
UnicodeDecodeError:“ascii”编解码器无法解码位置0:序号不在范围(128)中的字节0xae
编辑:根据下面的注释显示错误消息:

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)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/var/lib/python-support/python2.5/BeautifulSoup.py”,第1282行,在__
美化ToneSoop.uuu初始_uuuu(self,*args,**kwargs)
文件“/var/lib/python-support/python2.5/BeautifulSoup.py”,第946行,在__
self._feed()
文件“/var/lib/python support/python2.5/BeautifulSoup.py”,第971行,在_提要中
SGMLParser.feed(self,markup)
文件“/usr/lib/python2.5/sgmllib.py”,第99行,在提要中
自我激励(0)
goahead中的文件“/usr/lib/python2.5/sgmllib.py”,第133行
k=自我分析(i)
文件“/usr/lib/python2.5/sgmllib.py”,第285行,在parse_starttag中
self.\u convert\u ref,attrvalue)
UnicodeDecodeError:“ascii”编解码器无法解码位置0:序号不在范围(128)中的字节0xae
谢谢你的帮助

您在评论中说:“我只是查找了我试图解析的html的内容类型,看看它是否是我没有尝试过的内容(之前我只是假设它是UTF-8),但确实是UTF-8,所以又是一条死胡同。”

唉。这就是为什么我一直试图让你泄露你试图解析的HTML。错误消息表明(第一个)问题字节是
\xae
,它肯定不是UTF-8序列中的有效前导字节

泄露指向HTML的链接,或进行一些基本调试:

uc=html.decode('utf8')
工作还是失败?如果失败,有什么错误消息

你还说:“我开始认为这是BS中的一个bug,他们在文档中提到了这个bug,可以在这里看到:crummy.com/software/BeautifulSoup/CHANGELOG.html。”

我无法想象你指的是变更日志中的哪些模糊条目。在快速更新之前考虑调试问题。

更新在sgmllib.py中看起来像一个模糊的bug。在第394行中,将255更改为127,它似乎可以工作。角落案例:属性值中的HTML char ref(
®;
),在注释中使用128:“我只是查找了我试图解析的HTML的内容类型,看看它是否是我没有尝试过的东西(之前我只是假设它是UTF-8),但确实是UTF-8,所以又是一条死胡同。”

唉。这就是为什么我一直试图让你泄露你试图解析的HTML。错误消息表明(第一个)问题字节是
\xae
,它肯定不是UTF-8序列中的有效前导字节

泄露指向HTML的链接,或进行一些基本调试:

uc=html.decode('utf8')
工作还是失败?如果失败,有什么错误消息

你还说:“我开始认为这是BS中的一个bug,他们在文档中提到了这个bug,可以在这里看到:crummy.com/software/BeautifulSoup/CHANGELOG.html。”

我无法想象你指的是变更日志中的哪些模糊条目。在快速更新之前考虑调试问题。


更新在sgmllib.py中看起来像一个模糊的bug。在第394行中,将255更改为127,它似乎可以工作。角落案例:属性值中的HTML char ref(
®;
)和128,我尝试在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"

基于lxml,因此它也比beautifulsoup快得多。

我尝试在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"

基于lxml,因此它也比beautifulsoup快得多。

我没有否决。我只是觉得你应该准确地展示你所做的,而不是仅仅向我们扔一堆链接。缺少的链接:“一些html”。还有:什么版本的BS,什么版本的Python?请显示回溯。您得到的是Unicode De codeError,您认为3个提到Unicode En codeError的链接会有帮助吗?@rolling stone:指向Unicode DeencodeError的链接没有帮助,因为它们与您的问题完全无关。我试图提供帮助:请您提供您应该提供的基本事实,而不被询问:回溯、版本、输入数据。“请多管闲事,少管闲事”。@John Machin python 2.5版,BS 3.0.4版。添加了回溯。我看不出HTML代码是如何相关的,或者被认为是丢失的链接。使用BeautifulSoup解析非ASCII字符是一个常见问题(请参阅)。在我看过的所有问题中,几十个回答者中没有一个回答过