1

私は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)

これに取り組むために、私は2つの方法を実行しましたが、どちらも失敗しました.1つの方法は次のとおりです:

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

別の方法は次のとおりです。

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

2 に答える 2

6

findAll メソッドにユニコードを渡す必要があります。

# -*- coding: utf-8
... 
img_urls = form_soup.findAll('a', title=u'查看大图')

タイトル値の前にあるuUnicode リテラル マーカーに注意してください。これを機能させるには、ソース ファイルでエンコーディングを指定するか (codingファイルの上部にあるコメント)、代わりに Unicode エスケープ コードに切り替える必要があります。

img_urls = form_soup.findAll('a', title=u'\u67e5\u770b\u5927\u56fe')

内部的に、BeautifulSoup は Unicode を使用しますが、ASCII 以外の文字を含むバイト文字列を渡しています。BeautifulSoup はそれを 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>]
于 2012-06-23T10:18:09.233 に答える
1

Beautiful Soup 4.1.0では、属性値が UTF-8 から自動的に変換され、この問題が解決されます。

于 2012-06-23T17:42:38.647 に答える