URL Liste extrahieren

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
Levent
User
Beiträge: 5
Registriert: Dienstag 10. Januar 2012, 13:53

Hallo zusammen,

ich beschäftige mich nun einige Wochen mit Python und hab mich dazu entschlossen ein etwas größeres Projekt anzugehen. Konkret, will ich mir die Quoten von Oddset anschauen und da irgendwelche statistischen Analysen machen (ganz soweit bin ich noch nicht). Der erste Schritt ist natürlich, eine Art Datenbank von den ganzen Quoten samt Ergebnis zu bestellen. Ein Archiv hierfür gibts im Netz: https://www.oddset.de/odd/view/handle.6 ... =de&jdn=17

Ok, mit regular expressions hab ich mir schon eine Funktion programmiert, welche die Quoten und Ergebnisse von einer solchen Seite extrahiert und (sinnvoll) in einer Liste abspeichert. Und mit urllib2 weiss ich auch wie an den Quelltext einer URL rankomme. Was mir nun fehlt ist ein Programm, welches die beiden drop-down Menüs (Veranstaltungsjahr, Veranstaltungszeitraum) durchgeht und mir eine Liste von den ganzen urls erstellt. Ich schätz das ist nicht wirklich eine echte Python Frage, aber vielleicht könntet Ihr mir doch weiterhelfen.

Der relevante Quellcode von so einem drop-down Menü ist hier
<div class="select_container">

<div class="title">

<h1>Auswahl Spielplan</h1>

</div>

<div class="selector">

<form name="yearform" action="https://www.oddset.de/odd/controller/Ga ... =de&jdn=17" method="post">

<label for="select_year">Veranstaltungsjahr:</label>

<select id="select_year" name="year" class="year" onchange="this.form.submit()">

<option value="1999" title="Spielpläne für 1999">1999</option>

<option value="2000" title="Spielpläne für 2000">2000</option>

<option value="2001" title="Spielpläne für 2001">2001</option>

<option value="2002" title="Spielpläne für 2002">2002</option>

<option value="2003" title="Spielpläne für 2003">2003</option>

<option value="2004" title="Spielpläne für 2004">2004</option>

<option value="2005" title="Spielpläne für 2005">2005</option>

<option value="2006" title="Spielpläne für 2006">2006</option>

<option value="2007" title="Spielpläne für 2007">2007</option>

<option value="2008" title="Spielpläne für 2008">2008</option>

<option value="2009" title="Spielpläne für 2009">2009</option>

<option value="2010" title="Spielpläne für 2010">2010</option>

<option value="2011" title="Spielpläne für 2011" selected="selected">2011</option>

<option value="2012" title="Spielpläne für 2012">2012</option>

</select>
Ich such natürlich nicht einer implementierten Lösung, sondern nur nach Hinweisen welche Pakete und Funktionen mir hier weiterhelfen könnten.

Besten Dank,
Levent
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du könntest einen HTML-Parser verwenden (lxml.html, html5lib, ...) und die entsprechenden Werte aus den <option>-Tags herausfiltern. Damit kannst Du dann die URLs aufbauen.

Letztlich wirst Du den Parser dann wohl auch für die eigentlichen Seiten brauchen, oder werden da andere Dateien hinterlegt als HTML?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Levent
User
Beiträge: 5
Registriert: Dienstag 10. Januar 2012, 13:53

Hyperion hat geschrieben:Du könntest einen HTML-Parser verwenden (lxml.html, html5lib, ...) und die entsprechenden Werte aus den <option>-Tags herausfiltern. Damit kannst Du dann die URLs aufbauen.

Letztlich wirst Du den Parser dann wohl auch für die eigentlichen Seiten brauchen, oder werden da andere Dateien hinterlegt als HTML?
Die Werte herausfiltern krieg ich hin, aber wie bau ich damit die URLs auf? Das ist mir leider nicht klar.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Levent hat geschrieben: Die Werte herausfiltern krieg ich hin, aber wie bau ich damit die URLs auf? Das ist mir leider nicht klar.
Na, Du musst eben einen HTTP-Request erstellen, den Du mittels `urllib` absetzen kannst. Ob das nun mit `get` oder `post` geschieht, musst Du aus dem Formular der Seite herausfinden.

Nebenbei: Welchen HTML-Parser nutzt Du denn?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hyperion hat geschrieben:Nebenbei: Welchen HTML-Parser nutzt Du denn?
Na gar keinen, steht doch da. "Regular Expressions"... :shock:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Levent
User
Beiträge: 5
Registriert: Dienstag 10. Januar 2012, 13:53

Sorry für die lange Pause - ich sitze aber noch immer an diesem Problem. Die Methode ist 'Post' (steht im Quelltext), ich weiss aber nicht wie ich so ein http-request aussieht und kann auch irgendwie keine Seite finden die das für mich verständlich erklärt. Kann mich da jemand an der Hand nehmen und etwas weiter führen?
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

An der Stelle sind Module wie urllib.request (eingebaut, unschön im Umgang) oder requests (nicht eingebaut, netter im Umgang) sehr praktisch.
Levent
User
Beiträge: 5
Registriert: Dienstag 10. Januar 2012, 13:53

Ok, ein bisschen bin ich weitergekommen, dieser Link hat mir ziemlich weitergeholfen - ganz am Ziel bin ich noch immer nicht.

Ich habs versucht mit:

Code: Alles auswählen

import urllib
import urllib2

values={"yearform":"1999"}
data=urllib.urlencode(values)
request=urllib2.Request("https://www.oddset.de/odd/view/handle.2C3919A57DF1F6F41353FA6ECA7?gbn=21&loc=de&jdn=17",data)
response=urllib2.urlopen(request)
response.geturl()
Es wird zwar eine url zurückgegegen, nur leider ein falsche. Irgendwelche offensichtliche Fehler?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Levent hat geschrieben: Es wird zwar eine url zurückgegegen, nur leider ein falsche. Irgendwelche offensichtliche Fehler?
Was kommt denn zurück? Und wieso ist die "falsch"? Was hättest Du denn erwartet? Zudem: Interessiert Dich denn der Inhalt der Seite gar nicht - nach einem Request-Aufruf will man doch eigentlich den Content auswerten, oder?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Levent
User
Beiträge: 5
Registriert: Dienstag 10. Januar 2012, 13:53

das kommt zurück:

https://www.oddset.de/odd/view/handle.2 ... ssionid=d0
rRPqsTvBwKQF5Q8N1xz8LPgqYJgcRdPbBlKCWcVGfJCnYDgp7J!1194376814!slipf6!8001!-1!-19
20025697!slipf1!8001!-1?gbn=21&loc=de&jdn=17

was leider keine gülte url ist -> die gewünschte url schaut so aus:

https://www.oddset.de/odd/view/handle.3 ... =de&jdn=17

Den Teil um den Content auszuwerten ist schon programmiert.
Antworten