Name error: name not defined

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
randyandy040
User
Beiträge: 4
Registriert: Freitag 28. Dezember 2018, 17:12

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
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Lösch mal die zwei Leerzeilen in fetch(). Sag bescheid, ob es dann geht.
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

`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)
randyandy040
User
Beiträge: 4
Registriert: Freitag 28. Dezember 2018, 17:12

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:
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn du nur beschreibst was du vermeintlich gemacht hast, kann man da nur mit den Achseln Zucken. Zeig deinen neuen Code.
randyandy040
User
Beiträge: 4
Registriert: Freitag 28. Dezember 2018, 17:12

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) 
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
randyandy040
User
Beiträge: 4
Registriert: Freitag 28. Dezember 2018, 17:12

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 :)
Antworten