3

最近のツイートをスクレイピングするために、Twitter にログインしようとしています。次のコードがあります。

import mechanize
from bs4 import BeautifulSoup
import time
import html5lib


twitter = 'https://mobile.twitter.com/session/new'
br = mechanize.Browser()
response1 = br.open(twitter)

br.select_form(nr=0)
br['username'] = 'MYUSERNAME'
br['password'] = 'MYPASSWORD'

br.submit()

req = br.click_link(text='Me[IMG]')
response = br.open(req)
soup = BeautifulSoup(response.read())
soup.prettify() #does nothing at all
soup.head #also does nothing at all

過去数日間、複数のサイトでMechanize + Beautifulsoup を使用してきましたが、この問題は発生していません。Twitter の他のページでも、上記のコードは問題なく動作します。印刷prettify()してみましたが、うまくいきません。次のエラーが表示されます。

UnicodeEncodeError: 'ascii' コーデックは位置 6972 の文字 u'\xb7' をエンコードできません: 序数が範囲外です(128)

私はいくつかのgoogle-fuを実行しましたが、これはエンコーディングに関連していることがわかったので、コードを次のように調整します:

soup.prettify().encode('UTF-8')

そして、これはほとんどの場合機能します。つまり、少なくともすべてを印刷します。しかし、そのデータはどれも、通常のスープのインスタンスの「中に」あるようには見えません。たとえば、 ではなく にアクセスできませsoup.headsoup.bodySoup.find('foo')普通の古いものと同様に、何もしませんsoup.bsoup.headreturnの型を出力するとNoneType、いろいろと混乱してしまいます。

何が起きてる?

編集:何..?なぜこれが反対票を投じられているのですか?: (

4

1 に答える 1

2

これは、Beautiful Soup の html5lib ツリー ビルダーのバグです。次のリリースに含まれる修正をコミットしました。当面は、 html5lib の代わりに lxml を使用してマークアップを解析するよう Beautiful Soup に指示することをお勧めします。

于 2012-08-21T13:28:12.263 に答える