'NoneType' object has no attribute 'attrs'

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
Tron0070
User
Beiträge: 24
Registriert: Dienstag 28. April 2020, 12:57

Hallo Leute, ich bin neu im Forum und habe gerade erst mit Python begonnen.
Für eine Übung wollt ich mal alle Titel und Bilder URLs ausgeben lassen.

Leider komme ich nicht weiter, da ein Fehler ausgegeben wird wenn ein Titel kein Bild hat.
'NoneType' object has no attribute 'attrs'
Ich habe schon google bemüht. Aber ich konnte mit den Ergebnissen nichts anfangen, da ich mich noch nicht so gut auskenne um zu verstehen wie das umgesetzt wird.
Kann mir einer von euch bitte dabei helfen das es funktioniert?

Gruß Tron

Code: Alles auswählen

import requests
from bs4 import BeautifulSoup
r = requests.get("https://www.themoviedb.org/search?query=pulp%20fiction&language=de-DE")
doc = BeautifulSoup(r.text, "html.parser")


for card in doc.select(".card"):
    titel = (card.select_one(".title h2").text)
    
    image  = (card.select_one(".image .poster .result img").attrs["data-srcset"].split(","))
    image1 = (image[0].replace("1x", "").replace(" ", ""))
    image2 = (image[1].replace("2x", "").replace(" ", ""))
    
    print (titel)
    print (image1)
    print (image2)
    
    
    #break

Ausgabe:

Code: Alles auswählen

Pulp Fiction
https://image.tmdb.org/t/p/w94_and_h141_bestv2/hOg9USqmQmglmr5kGvpyg1XkhqN.jpg
https://image.tmdb.org/t/p/w188_and_h282_bestv2/hOg9USqmQmglmr5kGvpyg1XkhqN.jpg

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-1-7fc827b0dfe2> in <module>
      8     titel = (card.select_one(".title h2").text)
      9 
---> 10     image  = (card.select_one(".image .poster .result img").attrs["data-srcset"].split(","))
     11     image1 = (image[0].replace("1x", "").replace(" ", ""))
     12     image2 = (image[1].replace("2x", "").replace(" ", ""))

AttributeError: 'NoneType' object has no attribute 'attrs'



__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Klammern um deine Ausdruecke sind ueberfluessig und verwirren nur.

Wenn card.select_one kein Ergebnis erhaelt, ist der Rueckgabewert None. Du musst also erstmal das Ergebnis des select_one an eine Variable binden, und die auf None testen. Nur wenn sie das nicht ist, kann es weiter gehen:

Code: Alles auswählen

thingamabob = card.select_one(".image .poster .result img")
if thingamabob is not None:
     ...
Tron0070
User
Beiträge: 24
Registriert: Dienstag 28. April 2020, 12:57

Hallo __deets__, vielen Dank für Deine Hilfe.
Es funktioniert.

Code: Alles auswählen

for card in doc.select(".card"):
    titel = card.select_one(".title h2").text
    
    image  = card.select_one(".image .poster .result img")
    if image is not None:
        image  = card.select_one(".image .poster .result img").attrs["data-srcset"].split(",")
        image1 = image[0].replace("1x", "").replace(" ", "")
        image2 = image[1].replace("2x", "").replace(" ", "")
    else:
        image1 = "kein Bild"
        image2 = ""

    print (titel)
    print (image1)
    print (image2)

    #break
Tron0070
User
Beiträge: 24
Registriert: Dienstag 28. April 2020, 12:57

Hallo __blackjack__ , danke für Deinen Beitrag.

Ich will soweit wie es geht erst mal versuchen meinen eigenen Weg zu gehen, auch wenn es erst mal der Falsche ist. Wenn was im Code nicht funktioniert und ich lange Zeit dafür brauche das zu fixen, verkleiner ich den code etwas und probiere es weiter. Wenn es dann immer noch nicht läuft wird der code weiter verkleinert, sodass ich nur noch den kleinsten Teil vor mir habe. Das war der Code den ich gepostet hatte. Die Klassen- und Methodenbezeichnung war nur exemplarisch um einen besseren Überblick zu haben.

... Da es mir bis jetzt nicht gelungen ist meine Idee umzusetzen und ich vermute das mein Weg doch der falsche Weg sein könnte, werde ich wohl bald mal meinen richtigen Code Posten und hoffe auf Eure Hilfe.
Aber bis dahin will ich es erst mal noch selbst probieren.

Vielen Dank

Gruß Tron
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

Tron0070 hat geschrieben: Freitag 8. Mai 2020, 05:05 Wenn was im Code nicht funktioniert und ich lange Zeit dafür brauche das zu fixen, verkleiner ich den code etwas und probiere es weiter. Wenn es dann immer noch nicht läuft wird der code weiter verkleinert, sodass ich nur noch den kleinsten Teil vor mir habe.
Mit der Erkenntnis bist Du auf einem guten Weg: Richtig ist es, klein anzufangen und testen, ob es läuft. Dann das Programm schrittweise wachsen zu lassen und nicht erst alles runterzuschreiben, um anschließend die Fehler zu suchen.
Tron0070
User
Beiträge: 24
Registriert: Dienstag 28. April 2020, 12:57

Oh. Das sollte eigentlich in den Post "String in einer Funktion1 an die nächste Funktion2 weitergeben" rein.
Ich werde es dort noch mal posten.

Sorry.
Antworten