Image-url Scraper: url wird immer als none ausgespuckt | Requests

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
overload
User
Beiträge: 13
Registriert: Dienstag 6. April 2021, 13:41

Hallo zusammen,

ich bin noch komplett neu in der Programmierwelt. Ich will mir ein kleines Tool Scheiben um mit einem klick die neuesten eBay-Kleinanzeigen Inserate als Webhook an meinen discord server zu schicken.

Ich stehe gerade an folgendem Problem:
Ich will dazu in meinen Webhook das Bild von dem neuesten Inserat hinterlegen. Dazu bin ich wie folgt vorgegangen.

1. Ich habe mir alle Bilderquellen anzeigen lassen mit: bilder = soup.find_all('div', {"class": "aditem-image"})
2. Nun habe ich von allen Inseraten die Links zu den Bildern ebenso wie den Titel ausgespuckt bekommen.
3. Ich will jetzt aber nur die Links der Bilder haben. Diese wurden so ausgespuckt:

Code: Alles auswählen

</div>, <div class="aditem-image">
<div class="imagebox srpimagebox" data-imgsrc="https://i.ebayimg.com/00/s/MTYwMFgxMjAw/z/44wAAOSwkw9gaw9G/$_2.JPG" data-imgsrcretina="https://i.ebayimg.com/00/s/MTYwMFgxMjAw/z/44wAAOSwkw9gaw9G/$_35.JPG 2x" data-imgtitle="Pokémon Weiße Edition Baden-Württemberg - Ehrenkirchen Vorschau">
</div>
4. Da ich ja nur die "data-imgsrc" benötige habe ich mit folgendem code nur die Links filtern wollen:

Code: Alles auswählen

for bild in bilder:
    print(bild.attrs.get("imgsrc"))
5. Jetzt bekomme ich aber nur ca. 30x None ausgespuckt. Ich weiss nicht wo genau das Problem liegt.

Ich hoffe jemand von euch kann mir auf die Sprünge helfen und weiss wo mein Fehler ist. Bitte seid nicht zu streng mit mir, das ist mein erstes Projekt :)!
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Das Attribut heißt `data-imgsrc`.
overload
User
Beiträge: 13
Registriert: Dienstag 6. April 2021, 13:41

Sirius3 hat geschrieben: Mittwoch 7. April 2021, 09:12 Das Attribut heißt `data-imgsrc`.
Das ist mir beim absenden auch aufgefallen, war aber nur ein Fehler von mir und behebt das Problem leider nicht, weil ich etwas probiert hatte. Problem besteht also, leider, noch weiter.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Ach, bilder ist das übergeordnete div. Du mußt also eine Ebene tiefer in das div mit class=imagebox
overload
User
Beiträge: 13
Registriert: Dienstag 6. April 2021, 13:41

Sirius3 hat geschrieben: Mittwoch 7. April 2021, 12:23 Ach, bilder ist das übergeordnete div. Du mußt also eine Ebene tiefer in das div mit class=imagebox
Ach mist ich sehe deinen Post erst jetzt. Habe es dann durch langes grübeln selbst noch herausgefunden, aber jetzt wenigstens verstanden und verinnerlicht :lol: . Dennoch lieben Dank!

Aber vielleicht kann ich ja hier gleich mal mein neues Problem schildern und um eine Antwort bitten:

Ich habe das Grundgerüst fertig gestellt, nach einer gewissen Periode liefert mir das Script die neueste Anzeige von eBay-Kleinanzeigen nun habe ich allerdings das Problem, das manchmal mein Programm unerwartet beendet. Ich schätze mal, dass die Seite nicht richtig geladen wird, das Internet kurz weg ist o.ä. . Es Scheiter allerdings immer an der gleichen stelle, wenn es denn scheitert.

Code: Alles auswählen

# Findet alle bilder URLS auf der Webseite
        bilder = []
        alles = soup.find("div", {"class": "position-relative"})
        for bild in alles.findAll('div'):
            bilder.append(bild.get('data-imgsrc'))
Mit diesem Code Schnipsel habe ich mir jetzt alle Bilder Elemente (links) herausfiltern können. Manchmall spuckt er mir aber diesen Fehler raus:

Code: Alles auswählen

Traceback (most recent call last):
  File "/Users/svenwilczek/Desktop/Kleinanzeigen bot/main/main.py", line 67, in <module>
    for bild in alles.findAll('div'):
AttributeError: 'NoneType' object has no attribute 'findAll' 
Ich verstehe das so, dass es dort nichts zu finden gibt was für mich darauf hindeutet, dass vielleicht die Bilder nicht geladen werden. Denn wenn es ein Problem mit der ganzen Seite gäbe, würde ja schon früher ein Problem auftreten oder nicht?

Gibt es eine Möglichkeit, das Programm automatisch neuzustarten oder diesen "Fehler" zu umgehen?

Vielen dank schon einmal!
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Klasse "position-relative" hört sich für mich sehr allgemein an. Gibt es keine spezifischeres Suchmuster?
Dann holst Du Dir ALLE div-Elemente, aber wie Dein Ausschnitt schon zeigt, haben die wenigsten davon ein data-imgsrc-Attribut.
`findAll` hat die falsche Schreibweise und sollte daher schon lange nicht mehr verwendet werden. Als Ersatz gibt es `find_all`.

Die Lösung des Problems ist doch hier ganz einfach: Du testest `alles` auf None. Wobei Du schon genauer schauen solltest, warum das div nicht gefunden wird.
Antworten