BeautifulSoup, none type

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BreathBrightBrother
User
Beiträge: 11
Registriert: Mittwoch 4. Juni 2008, 08:13

Hallo,

Ich beginne mich gerade mit BeautifulSoup auseinanderzusetzen und scheitere früh :)

Code: Alles auswählen

import urllib2
from BeautifulSoup import BeautifulSoup

def getWikiPage(url):
    headers = {
        'User-Agent':
        'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3',
        'Accept-Encoding': 'deflate',
        'Accept-Charset': 'utf-8',
        'Referer': 'http://de.wikipedia.org/wiki/Hauptseite',
    }
    try:
        request = urllib2.Request(url, None, headers)
        response = urllib2.urlopen(request)
        content = response.read()
        response.close()
        return content
    except urllib2.HTTPError:
        print "HTTPError: %s" % url





page = getWikiPage("http://de.wikipedia.org/wiki/Kategorie:!Hauptkategorie")
soup = BeautifulSoup(page)
print type(soup)


tabellenkopf = soup.find('div','mw-subcategories')
print type(tabellenkopf)
span = tabellenkopf.findAll('span')
Ich bekomme die Fehlermeldung
span = tabellenkopf.findAll('span')
AttributeError: 'NoneType' object has no attribute 'findAll'
Was genau läuft schief bei der Sache?
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Wenn die Exception abgefangen wird kommt es zu keinem Return, also wird implizit "None" zurück gegeben, womit die Suppe nichts anfangen kann.
BreathBrightBrother
User
Beiträge: 11
Registriert: Mittwoch 4. Juni 2008, 08:13

Mich wundert ein wenig, dass es da zu einer Exception kommt *kopfkratz*

Also das scheint nur zu passieren, wenn es um <div id="bla"> geht. Bei <div class="bla"> tut es.
BlackJack

@BreathBrightBrother: Da kommt es auch nicht zu einer Ausnahme. Es gibt aber kein 'div'-Tag mit einem class='mw-subcategories'-Attribut, darum gibt `find()` als Wert `None` zurück. Wenn Du ein 'id'-Attribut mit dem Wert haben möchtest, dann musst Du das schon explizit sagen. Das ein zweites Argument bei `find()` & Co eine 'class' angibt, ist nur weil ``class`` in Python ein Schlüsselwort ist, dass man nicht als Keyword-Argument verwenden kann.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Auch gut, hatte nur nen kurzen Blick auf den Code ;D
Antworten