lxml

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
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

Hallo, ich möchte gerne von http://9gag.com Bilder herunterladen. Ich hatte vor, das mit lxml anzustellen, allerdings komme ich nicht ganz damit klar :oops:

Der HTML Code zu einem Bild sieht beispielsweise so aus:

Code: Alles auswählen

<div class="content">
            <div class="img-wrap">
    <a href="/gag/5730639"  target="_blank"  link="/gag/5730639" onclick="GAG.GA.track('Post', 'Clicked-List-Item', 'List-hot');" class="">
        <img src="http://d24w6bsrhbeh9d.cloudfront.net/photo/5730639_460s_v1.jpg" alt="Happy Halloween, Mom!" style="max-width:460px;"/>
    </a>
</div>
<div class="fatbigdick all-users-expand"></div>

	</div><!--end div.content-->
Jetzt dachte ich mir, ich könnte mit lxml einfach

Code: Alles auswählen

src="http://d24w6bsrhbeh9d.cloudfront.net/photo/5730639_460s_v1.jpg"
filtern, allerdings verstehe ich nicht ganz, wie das gehen soll. Alle Google-Ergebnisse zu "python lxml html" waren keine große Hilfe.

Hier mein gescheiterter Versuch:

Code: Alles auswählen

from lxml import html

url = 'http://9gag.com'
doc = html.parse(url)

r= doc.xpath('//div[@class="content"]/div[@class="img-wrap"]//img[@src]')
print r
Vielen Dank für Antworten im Voraus :mrgreen:
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
BlackJack

@StefanLawl: Das waren im Grunde ja auch die falschen Suchworte. Du willst nicht wissen wie man das in Python oder `lxml` macht, sondern wie man das in `XPath` formuliert. Das ist vollkommen unabhängig von Python oder einer anderen Programmiersprache.

Du hattest es schon fast. In den eckigen Klammern steht eine Bedingung die aus den Tags nur die auswählt auf welche die Bedingung zutrifft. Wenn man nur ein Attribut dort erwähnt, dann bekommt man alle Tags die dieses Attribut besitzen. Da `src` bei `<img>` AFAIK obligatorisch ist, sollte man damit immer alle Ergebnisse bekommen, die man auch ohne den Test bekommen hätte. Du willst nach dem `img` im nächsten Schritt in dem Pfad das Attribut von den `img`-Knoten haben, die im Schritt davor ausgewählt wurden:

Code: Alles auswählen

In [41]: doc.xpath('//div[@class="content"]/div[@class="img-wrap"]//img/@src')
Out[41]: 
['http://d24w6bsrhbeh9d.cloudfront.net/photo/5734378_460s_v1.jpg',
 'http://d24w6bsrhbeh9d.cloudfront.net/photo/5737011_460s.jpg',
 'http://d24w6bsrhbeh9d.cloudfront.net/photo/5733928_460s.jpg',
 'http://d24w6bsrhbeh9d.cloudfront.net/photo/5733976_460s.jpg',
 'http://d24w6bsrhbeh9d.cloudfront.net/photo/5737472_460s.jpg',
 'http://d24w6bsrhbeh9d.cloudfront.net/photo/5731606_460s_v1.jpg',
 'http://d24w6bsrhbeh9d.cloudfront.net/photo/5736965_460s.jpg',
 'http://d24w6bsrhbeh9d.cloudfront.net/photo/5734847_460s.jpg',
 'http://d24w6bsrhbeh9d.cloudfront.net/photo/5737449_460s.jpg']
Benutzeravatar
StefanLawl
User
Beiträge: 92
Registriert: Donnerstag 7. Juni 2012, 20:23

BlackJack hat geschrieben:@StefanLawl: Das waren im Grunde ja auch die falschen Suchworte. Du willst nicht wissen wie man das in Python oder `lxml` macht, sondern wie man das in `XPath` formuliert.
Mist, ich dachte xpath wäre schon zu detailliert als Suchbegriff. :mrgreen:
BlackJack hat geschrieben:Du hattest es schon fast. In den eckigen Klammern steht eine Bedingung die aus den Tags nur die auswählt auf welche die Bedingung zutrifft. Wenn man nur ein Attribut dort erwähnt, dann bekommt man alle Tags die dieses Attribut besitzen. Da `src` bei `<img>` AFAIK obligatorisch ist, sollte man damit immer alle Ergebnisse bekommen, die man auch ohne den Test bekommen hätte. Du willst nach dem `img` im nächsten Schritt in dem Pfad das Attribut von den `img`-Knoten haben, die im Schritt davor ausgewählt wurden.
Vielen Dank, jetzt versteh ich das endlich! :D
Man sagt uns wir sollen der Idee gedenken und nicht des Mannes. Denn ein Mensch kann versagen. Er kann gefangen werden. Er kann getötet und vergessen werden. Aber 400 Jahre später kann eine Idee immer noch die Welt verändern.
-V
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Alternativ gibts CSS-Selektoren (welche mittlerweile zumindest für Arch in ein seperates Paket verfrachtet wurden und zu XPath kompiliert werden).
Antworten