BeautifulSoup - TypeError: 'NoneType' object n'est pas appelable
J'ai besoin de faire mon code compatible avec python2.6 et BeautifulSoup 3. Mon code a été écrit à l'aide de python2.7 et dans ce cas à l'aide BS4. Mais quand j'essaie de le lancer à à presser serveur, j'obtiens cette erreur (il a python2.6 et 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
Si je change d':
p = soup.body.div.findAll('p')
puis, j'obtiens cette erreur:
p = soup.body.div.findAll('p')
TypeError: 'NoneType' object is not callable
Mise à jour de la levée d'erreur
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
De toute façon, les deux approches de travail sur mon Ubuntu avec python2.7 et bs4, mais pas sur à presser. Est-il une autre différence entre ces versions que je ne vois pas de savoir et me donne cette erreur?
Il n'y a pas de point de tomber à
Vous devriez voir que j'ai écrit, j'ai essayé d'utiliser la rétrocompatibilité de la syntaxe, mais toujours eu la même erreur.
from BeautifulSoup import BeautifulSoup
(version 3) lors de l'utilisation de la version 4, seule la syntaxe.Vous devriez voir que j'ai écrit, j'ai essayé d'utiliser la rétrocompatibilité de la syntaxe, mais toujours eu la même erreur.
OriginalL'auteur Andrius | 2014-10-28
Vous devez vous connecter pour publier un commentaire.
Vous utilisez BeautifulSoup 3, mais en utilisant BeautifulSoup 4 syntaxe.
Secours est en faute:
Si vous souhaitez utiliser la version 3 ou 4, s'en tenir à la version 3 de la syntaxe:
parce que
find_all
n'est pas une méthode valable dans BeautifulSoup 3, donc c'est plutôt interprétée comme une recherche par tag. Il n'y a pas defind_all
balise HTML, de sorteNone
est retourné, ce qui vous puis essayez d'appeler.Prochain, le analyseur utilisé par BeautifulSoup 3 réagit de manière différente aux cassé ou incomplet HTML. Si vous avez
lxml
installé sur Ubuntu, alors qui sera utilisé comme valeur par défaut de l'analyseur, et il va insérer un manque<body>
étiquette pour vous. BeautifulSoup 3 mai laisse cela.Je vous invite fortement à la place supprimer de secours, et le bâton avec BeautifulSoup version 4 seulement. La Version 3 a été abandonné depuis plusieurs années, et contient des bugs corrigés. BeautifulSoup 4 offre également d'autres fonctionnalités que vous souhaitez utiliser.
BeautifulSoup est pur Python et facilement installé dans un environnement virtuel sur toute plate-forme supportée par Python. Vous êtes pas liée au système fourni ici.
Sur Debian à presser par exemple, vous seriez coincé avec BeautifulSoup 3.1.0, et même la BeautifulSoup les développeurs ne veulent pas que vous l'utilisiez!. Votre problème avec
findAll
presque certainement, découle de la libération.J'étais sur le point de ce post sur votre question: qu'est-ce que la pleine traçabilité en amont de l'exception levée pour
findAll()
? Êtes-vous sûr que vous avez copié le bon message d'exception (c'est le même que pourfind_all
)?Je viens de copier/coller exact de l'erreur que j'obtiens lorsque l'aide findAll
intéressant, parce que je ne peux pas reproduire qu'avec BeautifulSoup 3.2.1. J'ai un à presser système, depuis 3.1.0 n'est pas disponible sur PyPI plus je vais essayer de l'installer.
cela ressemble à un 3.1.0-problème spécifique. Cette version fut rapidement remplacé par le 3.2 de la série, et les développeurs dit à tout le monde de ne pas utiliser 3.1 en 2009. Ne pas utiliser cette version, et vous n'aurez pas de problèmes.
OriginalL'auteur Martijn Pieters