Bild aus Webseite heraufiltern

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
razor01
User
Beiträge: 5
Registriert: Montag 13. Juli 2009, 20:17

Wie kann ich ein Bild aus einer Webseite herausfiltern und weiterverwenden z.B. speichern.

Habe unter anderem "mechanize" in Verwendung

mfg
razor01
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Indem du nach dem entsprechenden <img>-Tag suchst und dir das runterlädst, was in "src" steht.
lunar

In dem du mit einem HTML-Parser (html5lib, lxml.html oder BeautifulSoup) die Seite nach dem relevanten "img"-Tag durchsuchst, dessen "src"-Attribut auswertest und anschließend das Bild herunterlädst. Mit lxml.html sähe das so in etwa aus:

Code: Alles auswählen

from urllib import urlretrieve
from urlparse import urljoin
import lxml.html

url = 'http://example.com/asite'
document = lxml.html.parse(url)
for src in document.xpath('//img/@src'):
    image_url = urljoin(document.getroot().base_url, src)
    urlretrieve(image_url, filename=src)
Dieses Beispiel lädt alle Bilder der gegebenen Website herunter.
razor01
User
Beiträge: 5
Registriert: Montag 13. Juli 2009, 20:17

Also ich weiss in welchem tag sich das bild befindet
jedoch verändert sich die src immer

kann mir vielleicht jemand einen code hierfür zeigen
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Woher sollen wir jetzt wissen, welches spezielle Tag du meinst? Ein etwas allgemeineres Beispiel hat dir Lunar ja schon gegeben. Zeig halt mal den zugehörigen HTML-Code und sag, welches Tag du haben möchtest.
razor01 hat geschrieben:jedoch verändert sich die src immer
Das ist ja gerade bei diesem Vorgehen eher kein Problem.
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Wenn du nur einen Tag auswerten willst, kannst du das ja auch fix mit Regex machen.
<img src=\'(.*)\'> oder sowas. Aber dann musst du halt gucken, welches Bild du runterlädst. Aber normalerweise ist da ja immer "eindeutiger" HTML Code drumherum den du dann auch noch in die Suche miteinbeziehen kannst, so dass du das richtige Bild runterlädst ..

Wenn du aber mehr machen willst als nur das, wäre ein HTML-Parser echt nicht schlecht.
lunar

Wenn man das schon mit regulären Ausdrücken machen will, dann wenigstens richtig. In deinem Beispiel fehlt das Fragezeichen, um das "*" als nicht-greedy zu markieren.
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Das war auch nur ein unüberlegtes Beispiel und sollte eher als Pseudocode dienen, da der Ausdruck sowieso alle <img>-Tags matchen würde und man ihn wie gesagt noch anpassen müsste.
imho funktioniert der reguläre Ausdruck auch ohne Fragezeichen. Aber vielleicht gibt es ja Ausnahmefälle, in welchen der Ausdruck ohne ? fehlerhaft/unerwartet arbeitet. Dann wäre es nett, wenn du mich aufklären würdest :)

Code: Alles auswählen

>>> s = "<html><dfbdfgdfpigjfdr<img src='test'><ewikjrfwiet6_/dlfdsfk>"
>>> import re
>>> re.findall('<img src=\'(.*)\'>', s)
['test']
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

>>> s = "<html><dfbdfgdfpigjfdr<img src='test'><img src='spam'><ewikjrfwiet6_/dlfdsfk>"
>>> import re
>>> re.findall('<img src=\'(.*)\'>', s)
["test'><img src='spam"]
Bei "normalen" Seiten ist das keine Ausnahme, eher die Regel.
Das Leben ist wie ein Tennisball.
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Ah okay, so gibt das natürlich Sinn. Danke für das Aufklären.
Ich habe gedacht, dass die ' ' drumherum quasi als Grenze dienen.
Irgendwie ein merkwürdiges Verhalten. Naja, dann eben mit einem nicht-greedy Fragezeichen ;)
lunar

Das Verhalten ist nicht merkwürdig, sondern zu erwarten und dokumentiert. Übrigens muss man auch berücksichtigen, dass HTML neben einfachen auch doppelte Anführungszeichen erlaubt.
Karl
User
Beiträge: 252
Registriert: Freitag 29. Juni 2007, 17:49

Klar ist es dokumentiert und deshalb zu erwarten, nur eben für nicht so Bewanderte (wie mich) erstmal merkwürdig ;) Da man ja wie ich denken könnte, dass die ' ' wie gesagt quasi als Grenze für das (.*) dienen. Ich werde mir mal genauer angucken, warum es denn nicht so ist und man extra ein non-greedy Verhalten erzwingen muss.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und ``<img class="downloadlink" src="...">`` findet es auch nicht. Der Mythos dass man zum scrapen von HTML Regular Expressions gut nutzen ist eben genau das: ein Mythos.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten