AttributeError: 'NoneType' - Objekt hat kein Attribut 'strip' mit Python-WebCrawler
Ich Schreibe ein python-Programm zu durchforsten twitter mit einer Kombination von urllib2, die python twitter-wrapper für das api, und BeautifulSoup. Allerdings, wenn ich aus meinem Programm, ich bekomme eine Fehlermeldung der folgenden Art:
ray_krueger
RafaelNadal
Traceback (most recent call last):
File "C:\Users\Public\Documents\Columbia Job\Python Crawler\Twitter Crawler\crawlerversion9.py", line 78, in <module>
crawl(start_follower, output, depth)
File "C:\Users\Public\Documents\Columbia Job\Python Crawler\Twitter Crawler\crawlerversion9.py", line 74, in crawl
crawl(y, output, in_depth - 1)
File "C:\Users\Public\Documents\Columbia Job\Python Crawler\Twitter Crawler\crawlerversion9.py", line 74, in crawl
crawl(y, output, in_depth - 1)
File "C:\Users\Public\Documents\Columbia Job\Python Crawler\Twitter Crawler\crawlerversion9.py", line 64, in crawl
request = urllib2.Request(new_url)
File "C:\Python28\lib\urllib2.py", line 192, in __init__
self.__original = unwrap(url)
File "C:\Python28\lib\urllib.py", line 1038, in unwrap
url = url.strip()
AttributeError: 'NoneType' object has no attribute 'strip'
Ich bin völlig vertraut mit dieser Art von Fehler (neue python) und auf der Suche nach online ergab sehr wenig Informationen. Ich angehängt habe meinen code auch, aber haben Sie irgendwelche Vorschläge?
Danke
Snehizzy
import twitter
import urllib
import urllib2
import htmllib
from BeautifulSoup import BeautifulSoup
import re
start_follower = "NYTimeskrugman"
depth = 3
output = open(r'C:\Python27\outputtest.txt', 'a') #better to use SQL database thanthis
api = twitter.Api()
#want to also begin entire crawl with some sort of authentication service
def site(follower):
followersite = "http://mobile.twitter.com/" + follower
return followersite
def getPage(follower):
thisfollowersite = site(follower)
request = urllib2.Request(thisfollowersite)
response = urllib2.urlopen(request)
return response
def getSoup(response):
html = response.read()
soup = BeautifulSoup(html)
return soup
def get_more_tweets(soup):
links = soup.findAll('a', {'href': True}, {id : 'more_link'})
for link in links:
b = link.renderContents()
if str(b) == 'more':
c = link['href']
d = 'http://mobile.twitter.com' +c
return d
def recordlinks(soup,output):
tags = soup.findAll('div', {'class' : "list-tweet"})#to obtain tweet of a follower
for tag in tags:
a = tag.renderContents()
b = str (a)
output.write(b)
output.write('\n\n')
def checkforstamp(soup):
times = nsoup.findAll('a', {'href': True}, {'class': 'status_link'})
for time in times:
stamp = time.renderContents()
if str(stamp) == '3 months ago':
return True
def crawl(follower, output, in_depth):
if in_depth > 0:
output.write(follower)
a = getPage(follower)
new_soup = getSoup(a)
recordlinks(new_soup, output)
currenttime = False
while currenttime == False:
new_url = get_more_tweets(new_soup)
request = urllib2.Request(new_url)
response = urllib2.urlopen(request)
new_soup = getSoup(response)
recordlinks(new_soup, output)
currenttime = checkforstamp(new_soup)
users = api.GetFriends(follower)
for u in users[0:5]:
x = u.screen_name
y = str(x)
print y
crawl(y, output, in_depth - 1)
output.write('\n\n')
output.write('\n\n\n')
crawl(start_follower, output, depth)
print("Program done. Look at output file.")
- Der crawler im wesentlichen durch die erste Identifizierung eines follower und über schöne Suppe zu analysieren seine/Ihre Seite, bis ich laufen in tweets, die sind 3 Monate alt. Dann geht es an die ersten fünf Anhänger jeder Anhänger und so weiter, wiederholen den Vorgang, bis es auf die Tiefe, die ich angegeben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie
in
crawl()
,new_url
istNone
. Wie Sie bekommennew_url
ausget_more_tweets(new_soup)
bedeutet, dassget_more_tweets()
zurückNone
.Das bedeutet, dass
return d
nie erreicht, was bedeutet, dass entwederstr(b) == 'more'
war nie wahr, odersoup.findAll()
kamen nicht wieder alle links, sofor link in links
nichts.Bedeutet es genau das, was es sagt:
url.strip()
erfordert zunächst, herauszufinden, wasurl.strip
ist, d.h. sucht diestrip
Attributurl
. Dies schlug fehl, daurl
ist ein'NoneType' object
, d.h. ein Objekt, dessen TypNoneType
ist, d.h. das spezielle ObjektNone
.Vermutlich
url
wurde erwartet, dass einstr
, d.h. ein text-string, denn diese haben einestrip
Attribut.Dies geschah innerhalb
File "C:\Python28\lib\urllib.py"
, d.h., dieurllib
Modul. Das ist nicht dein code, so dass wir uns rückwärts durch die Ausnahme-trace, bis wir finden, was wir schrieb:request = urllib2.Request(new_url)
. Wir können nur davon ausgehen, dass dienew_url
, die wir passieren, um dieurllib2
Modul wird schließlich eineurl
variable irgendwo innerhalburllib
.Also, wo war
new_url
kommen? Wir suchen die Zeile des Codes in Frage (beachten Sie, dass es wird eine Zeilennummer in der exception-traceback), und wir sehen, dass die unmittelbar vorhergehende Zeile istnew_url = get_more_tweets(new_soup)
, also sind wir mit dem Ergebnis fürget_more_tweets
.Eine Analyse dieser Funktion zeigt, dass es sucht durch einige links, versucht, einen zu finden, der das Etikett 'mehr', und gibt uns die URL für den ersten link, den es findet. Der Fall, den wir noch nicht berücksichtigt ist, wenn es keine solchen links. In diesem Fall wird die Funktion nur erreicht das Ende, und implizit gibt Keine (das ist, wie Python Griffe-Funktionen, die das Ende erreichen, ohne eine explizite Rückgabe, da es keine Angabe einer return-Typ in Python und da ein Wert muss immer zurückgegeben werden), das ist, wo dieser Wert herkommt.
Vermutlich, wenn es kein 'mehr' link, dann sollten wir nicht versuchen, dem link zu Folgen überhaupt. Also, wir beheben den Fehler, indem Sie explizit die überprüfung für diese
None
Rückgabewert, und das überspringen derurllib2.Request
in diesem Fall, da gibt es keinen link zu Folgen.Durch die Art und Weise, diese
None
Wert wäre ein mehr idiomatische "Platzhalter" - Wert für die-noch-nicht bestimmtcurrenttime
als dieFalse
Wert, den Sie derzeit verwenden. Sie könnten auch erwägen, ein wenig mehr konsistent über die Trennung der Wörter mit Unterstrichen in Ihren Variablen und Methodennamen, die Dinge einfacher zu Lesen. 🙂Wenn Sie tun:
request = urllib2.Request(new_url)
,new_url
soll es sich um einen string, dieser Fehler sagt, es istNone
.Erhalten Sie new_url Wert von
get_more_tweets
- Funktion, so kehrte erNone
irgendwo.Wenn wir uns anschauen, dieser code gibt die Funktion nur, wenn
str(b)=="more"
auf einen link, so dass Ihr problem ist ", Warum nie str(b)=="mehr" passiert?".Sind Sie vorbei
None
eher als einen string zuurllib2.Request()
. Blick auf den code bedeutet dies, dassnew_url
istNone
manchmal. Und suchen Sie in Ihrerget_more_tweets()
- Funktion, die die Quelle für diese variable, die wir sehen:Diese Funktion gibt einen Wert zurück, nur wenn
b
ist"more"
weil Ihrereturn
- Anweisung wird eingerückt unter deinemif
. Wenn es gleich einem anderen Wert ist, wird kein Wert (D. H.None
) zurückgegeben.Müssen Sie entweder immer wieder eine gültige URL hier, oder Sie brauchen, um zu überprüfen, für die
None
return Wert vor der übergabe anurllib2.Request()
.