2016-03-18 18 views
-5

Ich versuche sechs Wikipedia-Seiten zu durchlaufen, um eine Liste aller verknüpften Songs zu erhalten. Es gibt mir diesen Fehler, wenn ich es im Terminal laufen:Warum bekomme ich eine "None" in meinem Python-Code?

Traceback (most recent call last): 
    File "scrapeproject.py", line 31, in <module> 
    print (getTableLinks(my_url)) 
    File "scrapeproject.py", line 20, in getTableLinks 
    html = urlopen(my_url) 
    File "/Users/adriana/Software/Python-3.5.1/mybuild/lib/python3.5/urllib/request.py", line 162, in urlopen 
    return opener.open(url, data, timeout) 
    File "/Users/adriana/Software/Python-3.5.1/mybuild/lib/python3.5/urllib/request.py", line 456, in open 
    req.timeout = timeout 
AttributeError: 'NoneType' object has no attribute 'timeout' 

Ich denke, das liegt daran, dass eine None zeigt sich hält, wenn ich die Songliste drucken. Hat jemand irgendwelche Vorschläge?

Code:

from urllib.request import urlopen 
from bs4 import BeautifulSoup 
import sys 
import http.client 

main = "https://en.wikipedia.org/wiki/Billboard_Year-End_Hot_100_singles_of_" 
year = 2009 

def createUrl(main, year): 
    for i in range(0, 6): # increment years so i can get each link 
     year += 1 
     print ("\n\n", year, "\n\n") 
     fullUrl = main + str(year) 
     return fullUrl 


my_url = createUrl(main, year) # this is how i make createUrl a variable to be used in other functions 

def getTableLinks(my_url): # there is a random none appearing in my code 

    # i think the problem is between here... 

    html = urlopen(my_url) 
    bsObj = BeautifulSoup(html.read(), "html.parser") 
    tabledata = bsObj.find("table", {"class":"wikitable"}).find_all("tr") 

    # ...and here 

    for table in tabledata: 
     try: 
      links = table.find("a") 
      if 'href' in links.attrs: 
       print (links.attrs['href']) 
     except: 
      pass 

print (getTableLinks(my_url)) 

Antwort

0

Das Problem liegt nicht in dem markierten Bereich. Das Problem liegt in der Schleife, in der Sie die fullUrl erstellen. Entferne das vollständig, da du keine Funktion benötigst, um den Link zu erstellen.

unten Ihre Funktionsdefinitionen Dann versuchen:

for n in range(2008,2015): 
    print(getTableLinks(main + str(n))) 

ändern die Jahre an Ihre Bedürfnisse anzupassen.

Ehrlich gesagt ist der beste Weg, dies für zukünftige Verwendung zu tun, Fehlerbehandlung zu verwenden. Auf diese Weise können Sie die Funktion ausführen, bis keine Jahre mehr übrig sind (Ausnahme wird ausgelöst), und die Schleife wird beendet. Dies erspart Ihnen die Überprüfung, wie viele Jahre es sind, alles, was Sie tun würden, ist das Anfangsjahr anzupassen. Um dies richtig zu machen, sollten Sie die Fehlerbehandlung nachschlagen und speziell den Fehler behandeln, der durch das Ausprobieren eines ungültigen Jahres zurückgegeben wird und so etwas wie außer AttributeError: oder was auch immer der Fehler das folgende Codebeispiel verwendet.

for n in range(2008,2015): 
    try: 
     print(getTableLinks(main + str(n))) 
    except: 
     break 
+0

Vielen Dank! Ich bekomme immer noch ein merkwürdiges Nichts, aber es schlingt sich schließlich durch meinen Code und bekommt alle Links, die ich brauche. –

+0

Gut. Fühlen Sie sich frei zu upvote. – Chris

+0

Würde gerne ... aber ich bin so neu, ich habe nicht das Privileg zu lol –

1

Sie sind nicht alles von createUrl Rückkehr so ​​wird None zurückgegeben statt

Wenn Sie einen Stapel von sechs URLs zu erstellen, um zu gehen und dann für Daten analysieren Ich würde vorschlagen, sie an eine Liste anzuhängen oder jede URL der Funktion zuzuweisen, um sie prozedural zu parsen und dann entweder das zu tun oder die Liste zurückzugeben und sie zum Parsen durchzuarbeiten.

+0

Wenn ich also von Print (fullurl) ändern fullurl zurückzukehren, es gibt mir: '2010 /wiki/Tik_Tok /wiki/Need_You_Now_ (Lady_Antebellum_song) /wiki/Hey, _Soul_Sister /wiki/California_Gurls ... /wiki/Teach_Me_How_to_Dougie /wiki/Try_Sleeping_with_a_Broken_Heart /wiki/Liebhaber, _Lover None' Das ist genau das, was ich will, aber ich will es dies bis 2015 tun, anstatt sie nur dort zu stoppen. Ich denke, die None bedeutet, dass es aus irgendeinem Grund nicht bis 2011 gehen kann. –

Verwandte Themen