我不熟悉beautifulsoup的编码。
当我处理某些页面时,某些属性是中文,我想使用这个中文属性来提取标签。
例如,如下所示的html:
<P class=img_s>
<A href="/pic/93/b67793.jpg" target="_blank" title="查看大图">
<IMG src="/pic/93/s67793.jpg">
</A>
</P>
我想提取&#39; /pic/93/b67793.jpg' 所以我做的是:
img_urls = form_soup.findAll('a',title='查看大图')
并遇到:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xb2 in position 0: ordinalnot in range(128)
要解决这个问题,我做了两个方法,都失败了: 一种方法是:
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
另一种方式是:
response = unicode(response, 'gb2312','ignore').encode('utf-8','ignore')
答案 0 :(得分:6)
您需要将unicode传递给findAll方法:
# -*- coding: utf-8
...
img_urls = form_soup.findAll('a', title=u'查看大图')
请注意标题值前面的u
unicode literal marker。您需要specify an encoding on your source file才能使用此功能(文件顶部的coding
注释),或转而使用unicode转义码:
img_urls = form_soup.findAll('a', title=u'\u67e5\u770b\u5927\u56fe')
在内部,BeautifulSoup使用unicode,但是你传递的是一个带有非ascii字符的字节字符串。 BeautifulSoup尝试解码为你unicode并失败,因为它不知道你使用了什么编码。通过为其提供现成的unicode,您可以解决问题。
工作示例:
>>> from BeautifulSoup import BeautifulSoup
>>> example = u'<P class=img_s>\n<A href="/pic/93/b67793.jpg" target="_blank" title="<A href="/pic/93/b67793.jpg" target="_blank" title="\u67e5\u770b\u5927\u56fe"><IMG src="/pic/93/s67793.jpg"></A></P>'
>>> soup = BeautifulSoup(example)
>>> soup.findAll('a', title=u'\u67e5\u770b\u5927\u56fe')
[<a href="/pic/93/b67793.jpg" target="_blank" title="查看大图"><img src="/pic/93/s67793.jpg" /></a>]
答案 1 :(得分:1)
美丽的汤4.1.0 will automatically convert attribute values from UTF-8,解决了这个问题: