2017-03-06 3 views
0

Ich bin ein Neuling und baue einen Web Scraper, der alle britischen McDonalds Adressen, Postleitzahlen und Telefonnummern (und schließlich nach csv exportieren) greifen wird. Ich verwende einen Aggregator anstelle der McDonalds-Website.Python Web Scraper - was habe ich falsch gemacht?

https://www.localstore.co.uk/stores/75639/mcdonalds-restaurant/

Ich habe geliehen und umgewidmet einige Code:

from bs4 import BeautifulSoup 
from urllib2 import urlopen 

BASE_URL = "https://www.localstore.co.uk/stores/75639/mcdonalds-restaurant/" 

def get_category_links(section_url): 
    html = urlopen(section_url).read() 
    soup = BeautifulSoup(html, "lxml") 
    boccat = soup.find("tr") 
    category_links = [BASE_URL + tr.a["href"] for tr in boccat.findAll("h2")] 
    return category_links 

def get_restaurant_details(category_url): 
    html = urlopen(category_url).read() 
    soup = BeautifulSoup(html, "lxml") 
    streetAddress = soup.find("span", "streetAddress").string 
    addressLocality = [h2.string for h2 in soup.findAll("span", "addressLocality")] 
    addressRegion = [h2.string for h2 in soup.findAll("span", "addressRegion")] 
    postalCode = [h2.string for h2 in soup.findAll("span", "postalCode")] 
    phoneNumber = [h2.string for h2 in soup.findAll("td", "b")] 
    return {"streetAddress": streetAddress, 
      "addressLocality": addressLocality, 
      "postalCode": postalCode, 
      "addressRegion": addressRegion, 
      "phoneNumber": phoneNumber} 

Das glaube ich nicht, dass ich die Daten gepackt haben - wie wenn ich laufe die folgende Zeile:

print(postalCode) 

oder

print(addressLocality) 

bekomme ich folgende Fehler

NameError: name 'postalCode' is not defined 

eine Idee, mit dem, was ich falsch mache?

+1

gut zu starten, müssen Sie Ihre Funktionen aufrufen ... oh die Gefahr des Coping und Einfügen ... –

+0

'get_restaurant_details' gibt ein dict. Wenn Sie auf die Daten in diesem Diktat zugreifen möchten, müssen Sie es indizieren. Es wird nicht automatisch eine Menge neuer Variablen in dem Bereich erstellen, der es aufgerufen hat. Diese 'postalCode' und andere Variablen sind lokal. – user2357112

+0

Wo ist 'postalCode' definiert? Liegt Ihre Print-Anweisung in dem Bereich, in dem 'postalCode' existiert? Namen, die in Funktionen definiert sind, werden nicht einfach ausgeleert, so dass Sie sie überall verwenden können! Stellen Sie sich vor, Sie versuchen zu verfolgen, was wo definiert ist. –

Antwort

3

Da andere kommentiert haben, müssen Sie zuerst Ihre Funktionen aufrufen.

Sie so etwas wie dieses

if __name__ == '__main__': 
    res = "https://www.localstore.co.uk/store/329213/mcdonalds-restaurant/london/" 
    print(get_restaurant_details(res)["postalCode"]) 

nach dem zwei Funktionen. Ich ging einfach auf die Seite und bekam eine URL, die für Ihr Programm funktionieren würde, aber ich habe es nie wirklich getestet. Das Hauptproblem, das Sie gerade haben, ist, dass Sie eigentlich gar nichts machen. Sie müssen eine Funktion aufrufen!

+0

. Können Sie in der ersten Zeile etwas mehr Klarheit schaffen? – JasonC

+0

Sie können mehr darüber lesen, was das hier tut: http://stackoverflow.com/questions/419163/what-does-if-name-main-do –

+0

sehr hilfreich - ich habe auch auf Funktionen allgemeiner auf YT gesehen . Scheint so, als hätte ich einen Weg zu gehen – JasonC

Verwandte Themen