BeautifulSoup - TypeError: 'NoneType' object ist nicht aufrufbar
Ich brauche, um meinen code rückwärts kompatibel mit python2.6 und BeautifulSoup 3. Mein code wurde geschrieben mit python2.7, und in diesem Fall mit BS4. Aber wenn ich versuche, führen Sie es mit squeezy-server, bekomme ich diese Fehlermeldung (es hat python2.6 und 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
Wenn ich ändern in:
p = soup.body.div.findAll('p')
dann bekomme ich diesen Fehler:
p = soup.body.div.findAll('p')
TypeError: 'NoneType' object is not callable
Update der Fehler geworfen
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
So oder so, beide Ansätze funktionieren auf meinem Ubuntu mit python2.7 und bs4, aber nicht auf squeezy. Gibt es einen anderen Unterschied zwischen diesen Versionen, dass ich nicht sehen/wissen und gibt mir diese Fehlermeldung?
- Es gibt keinen Punkt in fallen zurück
from BeautifulSoup import BeautifulSoup
(version 3) bei Verwendung der version 4 nur syntax. - Sie sollten sehen, dass ich geschrieben ich habe versucht, über rückwärts-kompatible syntax, aber immer noch gleiche Fehlermeldung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie mit BeautifulSoup 3, aber mit BeautifulSoup 4 syntax.
Ihre fallback-die Schuld liegt hier:
Wenn Sie verwenden möchten, entweder version 3 oder 4, stick auf die version 3 syntax:
weil
find_all
ist keine gültige Methode in BeautifulSoup 3, so ist es stattdessen interpretiert als eine tag-Suche. Es gibt keinefind_all
- tag in Ihre HTML, soNone
wird zurückgegeben, die Sie dann versuchen, zu nennen.Nächsten, die parser verwendet BeautifulSoup 3 reagieren unterschiedlich auf defekte oder unvollständige HTML. Wenn Sie
lxml
installiert auf Ubuntu, dann werden die als Standard-parser, und werde es einfügen fehlt<body>
tag für Sie. BeautifulSoup 3. Mai verlassen, dass aus.Ich bitte Sie eindringlich, statt entfernen das fallback-und-stick mit BeautifulSoup version 4 nur. Version 3 wurde vor Jahren eingestellt, und enthält ungebundenen Fehler. BeautifulSoup 4 bietet auch zusätzliche Funktionen, die Sie möglicherweise nutzen möchten.
BeautifulSoup ist reines Python und leicht installiert in einer virtuellen Umgebung auf jeder Plattform unterstützt, die von Python. Sie sind nicht gebunden an die system-gelieferten Paket hier.
Auf Debian Squeezy beispielsweise würden Sie stecken mit BeautifulSoup 3.1.0, und auch die BeautifulSoup Entwickler nicht wollen, dass Sie es verwenden!. Dein problem mit
findAll
fast sicher ergibt sich aus der Verwendung dieser Version.findAll()
? Sind Sie sicher, dass Sie kopiert die korrekten exception-Meldung (es ist das gleiche wie fürfind_all
)?sudo
hinzufügen eines Pakets neben Ihrem Skript. Sie können einfach nur legte es in das gleiche Verzeichnis und dann funktioniert es.~/.local/lib/python2.6/site-packages
Python und wählt automatisch die bis zu. Wenn Siepip
verwenden, können Siepip install --user beautifulsoup4
zu installieren, in das Verzeichnis.--user
option bekomme ich keine solche option Fehler. Ich habe versucht, wie diese--user=myuser
. Wenn Sie versuchen, ohne diese option, dann versucht es zu installieren, globaly, und ich bekomme die Erlaubnis verweigert " - Fehler. Gibt auch den gleichen Fehler, wenn Sie einfach mit--user
.pip
auf einem Debian Squeezy box, und die option war da, aber ich habe nicht überprüfen, wenn ich installiertpip
aus einem Debian-Paket geliefert. Sie können einfach erstellen Sie die~/.local/lib/python2.6/site-packages
Verzeichnisse, dann download BeautifulSoup 4, entpacken Sie das Archiv und legen Sie diebs4
- Verzeichnis und alles, was es im inneren~/.local/lib/python2.6/site-packages
.pip
version habe ich auf dem Debian Squeeze-box, und es ist ein backport. Ich installierte python-pip-1.0-1~bpo60+1 aus squeeze-backports; die 0.7.2 version in squeeze enthalten ist auch ein Weg, um alt zu werden viel.