Seite 1 von 1

Name error: name not defined

Verfasst: Freitag 28. Dezember 2018, 17:26
von randyandy040
Hallo und guten Abend,

ich habe als Python-Neuling ein (kleines?) Problem

Wie ihr sehen könnt übergibt meine Klasse einen returnwert "articles".
Innerhalb der Klasse ist auch alles bestens, in der nächsten Jupyther-Zeile in welcher ich die Liste mittels for in ausgeben möchte moniert der Interpreter
"name 'articles' is not defined", was ich mir nicht ganz erklären kann, denn ich übergebe ja den returnwert um ihn weiterverarbeiten zu können.
Innerhalb der Klasse / Funktion funktioniert die Ausgabe auch bestens, jedoch nicht im letzten Aufruf.
Sollte das doch ein Scopeproblem sein?? Ich werd gerade verrückt weil ich nach mittlerweile 2 Stunden noch immer keine Lösung gefunden habe....Ich wäre für jede Hilfe wirklich dankbar.

Beste Grüße

Andre

Code: Alles auswählen

class CrawledArticle():
    def __init__(self, title, emoji, content, image):
        self.title = title
        self.emoji = emoji
        self.content = content
        self.image = image

class ArticleFetcher():
    def fetch(self):
        url = "http://python.beispiel.programmierenlernen.io/index.php"
        r = requests.get(url)
        doc = BeautifulSoup(r.text, "html.parser")
        
        articles = []
        for card in doc.select(".card"):
            emoji = card.select_one(".emoji").text
            content = card.select_one(".card-text").text
            title = card.select(".card-title span")[1].text
            image = urljoin(url, card.select_one("img").attrs["src"])

            crawled = CrawledArticle(title, emoji, content, image)
            articles.append(crawled)
        for article in articles:
            print(article.image)
        return articles

Code: Alles auswählen

fetcher = ArticleFetcher()
fetcher.fetch()

Code: Alles auswählen

for article in articles:
    print(article.image)
Ausgabe: NameError Traceback (most recent call last)
<ipython-input-27-090828a2c1d0> in <module>
----> 1 for article in articles:
2 print(article.image)

NameError: name 'articles' is not defined

Re: Name error: name not defined

Verfasst: Samstag 29. Dezember 2018, 00:07
von pillmuncher
Lösch mal die zwei Leerzeilen in fetch(). Sag bescheid, ob es dann geht.

Re: Name error: name not defined

Verfasst: Samstag 29. Dezember 2018, 00:16
von Sirius3
`articles` ist nur eine lokale Variable in der Methode `fetch`. Du mußt schon den Rückgabewert einer Variable im Namensraum des Aufrufers zuweisen:

Code: Alles auswählen

fetcher = ArticleFetcher()
articles = fetcher.fetch()
for article in articles:
    print(article.image)

Re: Name error: name not defined

Verfasst: Samstag 29. Dezember 2018, 14:36
von randyandy040
Hallo allerseits,

ich habe nun sowohl die Leerzeilen gelöscht als auch, wie von Sirius angemerkt den Aufruf in den Block der Objekterzeugung / Methodenaufrufs verlegt (so war es allerdings ursprünglich auch), jedoch wird weiterhin die Meldung ausgegeben …. :cry:

Re: Name error: name not defined

Verfasst: Samstag 29. Dezember 2018, 14:45
von __deets__
Wenn du nur beschreibst was du vermeintlich gemacht hast, kann man da nur mit den Achseln Zucken. Zeig deinen neuen Code.

Re: Name error: name not defined

Verfasst: Samstag 29. Dezember 2018, 14:48
von randyandy040
Haste recht :)

Ich leg mal das komplette Gerät rein

Violla:

Code: Alles auswählen

 import requests 

Code: Alles auswählen

from bs4 import BeautifulSoup
from urllib.parse import urljoin 

Code: Alles auswählen

class CrawledArticle():
    def __init__(self, title, emoji, content, image):
        self.title = title
        self.emoji = emoji
        self.content = content
        self.image = image

class ArticleFetcher():
    def fetch(self):
        url = "http://irgendeineseite.com/index.php" 
        r = requests.get(url)
        doc = BeautifulSoup(r.text, "html.parser")
        articles = []
        for card in doc.select(".card"):
            emoji = card.select_one(".emoji").text
            content = card.select_one(".card-text").text
            title = card.select(".card-title span")[1].text
            image = urljoin(url, card.select_one("img").attrs["src"])
            crawled = CrawledArticle(title, emoji, content, image)
            articles.append(crawled)
       # for article in articles:
           #print(article.image)
        return articles 

Code: Alles auswählen

fetcher = ArticleFetcher()
fetcher.fetch()
for article in articles:
    print(article.image) 

Re: Name error: name not defined

Verfasst: Samstag 29. Dezember 2018, 14:59
von __deets__
Warum so zerstückelt?

Und du musst den Rückgabewert von fetch auch an den Namen articles zuweisen. Sonst gibt’s den auch nicht. Nur weil irgendwo in irgendeiner Methode ein Name existiert, erscheint der doch nicht magisch anderswo.

Re: Name error: name not defined

Verfasst: Samstag 29. Dezember 2018, 15:20
von randyandy040
Achgott, sowas bescheuertes, logisch :D Ja, danke, jetzt hab ichs: articles = fetcher.fetch()

Ist so zerstückelt weil es aus jupither kommt, kanns aber künftig auch in einem Block reinwerfen wenn das Übersichtlicher ist.
Danke für die Inputs, jetzt läufts :)