私のコードを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では機能しません。これらのバージョンの間に、私が表示/認識せず、このエラーが発生する他の違いはありますか?
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
に関する問題は、ほぼ確実にそのリリースを使用していることが原因です。