我正在尝试使用Python的BeautifulSoup库进行一些简单的网页抓取,当尝试解析大多数YouTube页面时,我遇到了UnicodeDecodeError。
似乎YouTube正在为HTMl提供无效字符。当然,这是他们最终的问题,但我认为BeautifulSoup的重点在于它可以处理不正确的页面并对结果做出最大努力的猜测。如果它只是丢弃了无效字符,我会很高兴。我远不是一位Unicode专家,我曾经尝试过encode
和decode
的各种神奇咒语对我没有任何帮助。
有人对如何处理此错误有任何建议吗?我不希望我的代码特定于YouTube,因为它需要处理许多用户指定的网页。
这是一个非常简单的代码片段,用于演示此问题:
import urllib
from bs4 import BeautifulSoup
url='https://www.youtube.com/watch?v=W9MzrirPrCI'
text = urllib.urlopen(url).read()
soup = BeautifulSoup(text)
最后一行导致以下错误:
UnicodeDecodeError Traceback (most recent call last)
/cygdrive/d/home/ll-virtualenv/lib/python2.7/site-packages/Django-1.5.1-py2.7.egg/django/core/management/commands/shell.pyc in <module>()
----> 1 soup = BeautifulSoup(text)
/cygdrive/d/home/ll-virtualenv/lib/python2.7/site-packages/bs4/__init__.pyc in __init__(self, markup, features, builder, parse_only, from_encoding, **kwargs)
170
171 try:
--> 172 self._feed()
173 except StopParsing:
174 pass
/cygdrive/d/home/ll-virtualenv/lib/python2.7/site-packages/bs4/__init__.pyc in _feed(self)
183 self.builder.reset()
184
--> 185 self.builder.feed(self.markup)
186 # Close out any unfinished strings and close all the open tags.
187 self.endData()
/cygdrive/d/home/ll-virtualenv/lib/python2.7/site-packages/bs4/builder/_lxml.pyc in feed(self, markup)
193 def feed(self, markup):
194 self.parser.feed(markup)
--> 195 self.parser.close()
196
197 def test_fragment_to_document(self, fragment):
/usr/lib/python2.7/site-packages/lxml-3.1.0-py2.7-cygwin-1.7.17-i686.egg/lxml/etree.dll in lxml.etree._FeedParser.close (src/lxml/lxml.etree.c:88786)()
/usr/lib/python2.7/site-packages/lxml-3.1.0-py2.7-cygwin-1.7.17-i686.egg/lxml/etree.dll in lxml.etree._TargetParserContext._handleParseResult (src/lxml/lxml.etree.c:98085)()
/usr/lib/python2.7/site-packages/lxml-3.1.0-py2.7-cygwin-1.7.17-i686.egg/lxml/etree.dll in lxml.etree._TargetParserContext._handleParseResult (src/lxml/lxml.etree.c:97909)()
/usr/lib/python2.7/site-packages/lxml-3.1.0-py2.7-cygwin-1.7.17-i686.egg/lxml/etree.dll in lxml.etree._ExceptionContext._raise_if_stored (src/lxml/lxml.etree.c:9071)()
/usr/lib/python2.7/site-packages/lxml-3.1.0-py2.7-cygwin-1.7.17-i686.egg/lxml/etree.dll in lxml.etree._handleSaxData (src/lxml/lxml.etree.c:94081)()
UnicodeDecodeError: 'utf8' codec can't decode byte 0xd7 in position 22: invalid continuation byte
答案 0 :(得分:1)
BeautifulSoup 4到版本4.0.3存在编码问题,并且它已经在最新版本中修复了一个错误。所以你应该将你的美丽汤升级到最新版本。
您可以使用pip将美丽的汤升级到最新版本(如果您使用的是pip)
pip install beautifulsoup --upgrade
写这个答案时,美丽的汤是4.3.2,其中没有关于编码的问题。
此外,我在最新的bs4上尝试了你的代码,并且没有这样的问题。
答案 1 :(得分:0)
在导入beautifulsoup模块之前尝试sys.setdefaultencoding("utf-8")
?