web-dev-qa-db-ja.com

BeautifulSoup-TypeError: 'NoneType'オブジェクトは呼び出し不可能です

私のコードをpython2.6およびBeautifulSoup 3と下位互換にする必要があります。私のコードはpython2.7を使用して、この場合はBS4を使用して作成されました。しかし、squeezyサーバーで実行しようとすると、次のエラーが発生します(python2.6とbs3があります)。

try:
    from bs4 import BeautifulSoup
except ImportError:
    from BeautifulSoup import BeautifulSoup

gmp = open(fname, 'r')
soup = BeautifulSoup(gmp)
p = soup.body.div.find_all('p')

p = soup.body.div.find_all('p')
TypeError: 'NoneType' object is not callable

私が次のように変更した場合:

   p = soup.body.div.findAll('p')

それから私はこのエラーを受け取ります:

p = soup.body.div.findAll('p')
TypeError: 'NoneType' object is not callable

スローされたエラーの更新

  File "/home/user/openerp/7.0/addons/my_module/models/gec.py", line 401, in parse_html_data
    p = soup.body.div.findAll('p') #used findAll instead of find_all for backwards compatability to bs3 version
TypeError: 'NoneType' object is not callable

どちらの方法でも、どちらのアプローチもpython2.7とbs4を使用するUbuntuで機能しますが、squeezyでは機能しません。これらのバージョンの間に、私が表示/認識せず、このエラーが発生する他の違いはありますか?

12
Andrius

BeautifulSoup 3を使用していますが、BeautifulSoup 4構文を使用しています。

あなたのフォールバックはここで間違っています:

try:
    from bs4 import BeautifulSoup
except ImportError:
    from BeautifulSoup import BeautifulSoup

バージョン3または4のいずれかを使用する場合は、バージョン3の構文に固執します。

p = soup.body.div.findAll('p')

find_allはBeautifulSoup 3では有効なメソッドではないため、タグ検索として解釈されます。 HTMLにfind_allタグがないため、Noneが返されます。これを呼び出してください。

次に、BeautifulSoup 3で使用されるparserは、壊れた、または不完全なHTMLに対して異なる応答をします。 Ubuntuにlxmlがインストールされている場合、それがデフォルトのパーサーとして使用され、不足している<body>タグが挿入されます。 BeautifulSoup 3はそれを省くかもしれません。

代わりにフォールバックをremoveして、BeautifulSoupバージョン4onlyを使用することを強くお勧めします。バージョン3は数年前に廃止されており、未修正のバグが含まれています。 BeautifulSoup 4には、利用したい追加機能もあります。

BeautifulSoupは純粋なPythonであり、Pythonがサポートする任意のプラットフォーム上の仮想環境に簡単にインストールできます。ここではシステム提供のパッケージに関連付けられていますnot

たとえば、Debian Squeezyでは、BeautifulSoup 3.1.0で立ち往生していて、 BeautifulSoup開発者はそれを使用したくない! です。 findAllに関する問題は、ほぼ確実にそのリリースを使用していることが原因です。

21
Martijn Pieters