BeautifulSoup - TypeError: Das Objekt 'NoneType' kann nicht aufgerufen werden

9

Ich muss meinen Code rückwärtskompatibel mit python2.6 und BeautifulSoup 3 machen. Mein Code wurde mit python2.7 geschrieben und in diesem Fall mit BS4. Aber wenn ich versuche, es auf dem squeezy-Server auszuführen, erhalte ich diesen Fehler (er hat python2.6 und bs3):

%Vor%

Wenn ich zu:

ändere %Vor%

dann bekomme ich diesen Fehler:

%Vor%

Aktualisierung des geworfenen Fehlers

%Vor%

Wie auch immer, beide Ansätze funktionieren auf meinem Ubuntu mit python2.7 und bs4, aber nicht mit squeezy. Gibt es einen anderen Unterschied zwischen den Versionen, die ich nicht sehe / kenne und mir diesen Fehler gibt?

    
Andrius 28.10.2014, 08:05
quelle

1 Antwort

18

Sie verwenden BeautifulSoup 3, verwenden aber die BeautifulSoup 4-Syntax.

Ihr Fallback ist hier schuld:

%Vor%

Wenn Sie entweder Version 3 oder 4 verwenden möchten, halten Sie sich an die Syntax der Version 3:

%Vor%

weil find_all in BeautifulSoup 3 keine gültige Methode ist, wird es stattdessen als Tag-Suche interpretiert. Es gibt kein find_all -Tag in Ihrem HTML, daher wird None zurückgegeben, welches Sie dann aufrufen möchten.

Als nächstes reagiert der Parser , der von BeautifulSoup 3 verwendet wird, anders auf beschädigten oder unvollständigen HTML. Wenn Sie lxml auf Ubuntu installiert haben, wird dieser als Standard-Parser verwendet und fügt ein fehlendes <body> -Tag für Sie ein. BeautifulSoup 3 kann das auslassen.

Ich fordere Sie dringend dazu auf, das Fallback zu entfernen und nur bei BeautifulSoup Version 4 zu bleiben . Version 3 wurde vor Jahren eingestellt und enthält nicht behobene Fehler. BeautifulSoup 4 bietet auch zusätzliche Funktionen, die Sie vielleicht nutzen möchten.

BeautifulSoup ist reines Python und kann leicht in einer virtuellen Umgebung auf jeder von Python unterstützten Plattform installiert werden. Sie sind nicht hier an das vom System bereitgestellte Paket gebunden.

Unter Debian Squeezy zum Beispiel wären Sie mit BeautifulSoup 3.1.0 und sogar mit der BeautifulSoup Entwickler wollen nicht, dass Sie es verwenden! . Dein Problem mit findAll stammt wahrscheinlich von der Verwendung dieser Version.

    
Martijn Pieters 28.10.2014 08:09
quelle