Seite 1 von 1

BeautifulSoup, none type

Verfasst: Sonntag 31. August 2008, 22:15
von BreathBrightBrother
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?

Verfasst: Sonntag 31. August 2008, 22:17
von audax
Wenn die Exception abgefangen wird kommt es zu keinem Return, also wird implizit "None" zurück gegeben, womit die Suppe nichts anfangen kann.

Verfasst: Sonntag 31. August 2008, 22:23
von BreathBrightBrother
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.

Verfasst: Sonntag 31. August 2008, 23:50
von 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.

Verfasst: Montag 1. September 2008, 00:13
von audax
Auch gut, hatte nur nen kurzen Blick auf den Code ;D