2012-06-23 32 views
1

我对beautifulsoup的编码不熟悉。如何在beautifulsoup中查看属性时使用标签

当我解决了一些页面,一些属性是中文,我想用这个中文属性来提取标签。

例如,一个HTML象下面这样:

<P class=img_s> 
<A href="/pic/93/b67793.jpg" target="_blank" title="查看大图"> 
<IMG src="/pic/93/s67793.jpg"> 
</A> 
</P> 

我想提取 '/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) 

与这个解决,我已经做了两个方法,都失败了: Ø NE的方法是:

import sys 
reload(sys) 
sys.setdefaultencoding("utf-8") 

另一种方式是:

response = unicode(response, 'gb2312','ignore').encode('utf-8','ignore') 

回答

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>] 
+0

如何找到每一个中国人的对应unicode.such查看大图= \ u67e5 \ u770b \ u5927 \ u56fe ,在哪里可以找到它?thx pieters – young001

+0

你给了我一个想法,如果我可以将所有非ascii字符替换为unicode,这样beautifulsoup可以与非英文页面一起工作。 – young001

+0

@ young001:我刚刚在python提示符下键入'u'',复制并粘贴您的表意文字,然后添加另一个关闭'''并敲回车。然后Python向我展示了unicode逃脱。 –

相关问题