http dir durchlaufen

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
fuppes
User
Beiträge: 28
Registriert: Dienstag 15. April 2008, 22:33

Hi,

wie bekomme ich das hin das ich ein http Verzeichnis wie http://repo.exist.com/dist/maestro/
durchlaufen kann, also genauso wie ein lokales verzeichnis (Also die unterverzeichnisse aufrufen, files lesen)? hatte gedacht das geht irgendwie mit urllib oder urllib2, aber irgendwie habe ich dazu nix gefunden.
AlArenal
User
Beiträge: 23
Registriert: Sonntag 27. April 2008, 00:53
Wohnort: Iserlohn
Kontaktdaten:

Das geht auch nicht, weil eine URL im HTTP nunmal etwas anderes ist als ein Verzeichnis-Pfad in einem Dateisystem. Es ist allein Sache des Webservers / der Webanwendung zu entschieden, was zurückgeliefert wird, wenn eine URL abgefragt wird. Dabei spielt es keine Rolle, ob diese URL nun aussieht wie ein Verzeichnispfad oder nicht.
"Ein schwarzes Loch hat keine Haare" - John A. Wheeler
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Dem stimme ich nicht ganz zu.

Schliesslich hat man die Möglichkeit ein "os" (os.path) Modul-ähnliches Wrappermodul aufzubauen, welches einem die nötigen Informationen aus der Webseite parst und die gewohnten Funktionen anbietet.

Hier mal ein kleines Beispiel ('htmlos' wäre in dem Falle ein selber zu schreibendes Modul ;) und ist lediglich bisher Fiktion):

htmlos.py

Code: Alles auswählen

import urllib2
from xml.dom.minidom import parseString

ATTR_CLASS = 'class'
ATTR_HREF = 'href'
IGNORE_PATHS = ['.', '..']
ACLASS_NAME = 'n'


MSG_NOT_EXIST = "target directory not found"
MSG_INVALID_DIR = "target url is not representing a directory"

def listdir(url):
    try:
        u = urllib2.urlopen(url)
    except urllib2.URLError, err:
        raise OSError(MSG_NOT_EXIST)
    if not u.headers.dict['content-type'].lower() == 'text/html':
        raise OSError(MSG_INVALID_DIR)
    try:
        hp = parseString(u.read())
    except:
        raise OSError(MSG_INVALID_DIR)
    try:
        table = hp.getElementsByTagName("table")[0]
        _thead = table.getElementsByTagName("thead")[0]
        _tbody = table.getElementsByTagName("tbody")[0]
    except IndexError:
        raise OSError(MSG_INVALID_DIR)
    result = []
    for row in _tbody.getElementsByTagName("tr"):
        for col in row.getElementsByTagName("td"):
            if col.hasAttribute(ATTR_CLASS) and \
               col.getAttribute(ATTR_CLASS) == ACLASS_NAME and \
               col.firstChild.hasAttribute(ATTR_HREF):
                value = col.firstChild.getAttribute(ATTR_HREF).replace('/', '')
                if value not in IGNORE_PATHS:
                    result.append(value)
                    break
    return result
Die Anwendung und das Ergebnis könnten dann z.B. so aussehen:

Code: Alles auswählen

>>> import htmlos
>>> htmlos.listdir("http://repo.exist.com/dist/maestro/")
[u'1.5', u'1.5.1', u'1.5.2', u'1.5.3', u'code', u'README']

>>> htmlos.listdir("http://python-forum.de")
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
  File "D:\htmlos.py", line 23, in listdir
    raise OSError(MSG_INVALID_DIR)
OSError: target url is not representing a directory

>>Masaru<<
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das wird aber vermutlich an Lighttpd-Index Directories scheitern. Oder an SVN-Directories.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Mit Gewissheit ... solche Wrapper lassen sich "nur" customized betreiben.
Wohl auch ein Grund, warum noch nie jemand eine Bibliothek draus gemacht hat.

Ich habe lediglich gezeigt *das* es geht, so wie vom TE ja auch erfragt wurde.

Mit einem Adapter-Klassen/Schema-Modell könnte man aber vielleicht auch allgemeiner einige gängige "Directory Lists" Formate/Seiten abfrühstücken.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Bekanntlich kann man den Index auch stark anpassen, zumindest bei Apache.

Vielleicht sollte man anders vorgehen und alle Links aus der Seite rausfischen und nachsehen ob diese zur Domain passen. Aber eine generelle Lösung wird es dafür nicht geben...

btw. sind die Daten evtl. über FTP erreichbar, wäre das sinnvoller ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Sehe ich auch so ... eine generelle Lösung wird es nicht geben.
jens hat geschrieben:...Vielleicht sollte man anders vorgehen und alle Links aus der Seite rausfischen und nachsehen ob diese zur Domain passen...
... halte ich für eine generelle Lösung ungeeignet.

Die "hrefs" (links) auf der Beispiels-Webseite z.B. sind leider keine absoluten Pfade wie ...
- http://repo.exist.com/dist/maestro/1.5/
- http://repo.exist.com/dist/maestro/README/

sondern lediglich nur als relative Pfade angegeben:
- 1.5/
- README/

Die Domain hierüber abzufackeln ist nicht gerade sonderlich geschickt. Hinzu kommt noch, dass eventuell auch noch andere Links aus der Domain auf der Directory List Seite (z.B. Disclaimer, Contact, etc.) vorhanden sind, die so ganz und gar nichts mit der abgebildeten Verzeichnisstruktur zu tun haben.

>>Masaru<<
Aprilia
User
Beiträge: 50
Registriert: Dienstag 15. April 2008, 12:09
Wohnort: Görlitz (östlichste stadt Dtl's)

http://de.selfhtml.org/

schau mal da nach
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

... worauf willst du hinaus Aprilia?
Aprilia
User
Beiträge: 50
Registriert: Dienstag 15. April 2008, 12:09
Wohnort: Görlitz (östlichste stadt Dtl's)

sry war der falsche link.....

sch... und der andere ist jetzt weg....
sry !!!
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

^^ najut ... vielleicht findest Du den Link ja wieder und trägst ihn dann hier noch nach ;).
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Masaru hat geschrieben:Die "hrefs" (links) auf der Beispiels-Webseite z.B. sind leider keine absoluten Pfade wie ...
- http://repo.exist.com/dist/maestro/1.5/
- http://repo.exist.com/dist/maestro/README/

sondern lediglich nur als relative Pfade angegeben:
- 1.5/
- README/
Insofern ist es sogar besser, da relative Pfade ja schon implizieren, dass es auf dem selben Hostnamen ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Besser? Nicht wirklich ... wie ich schon angesprochen habe, kann es sich um relative Links handeln, hinter denen sich gar keine Elemente aus dem virtuellen Filesystem befinden, sondern andere Dinge wie z.B. ein Servlet, bli bla blupp.

Wenn man den HTML-Content grob kennt, abgrenzen und durchlaufen kann (wie im Beispiel anhand des Node-Parsings über die Tabelle), hat man eine relativ hohe Chance auch die richtigen Elemente zu treffen.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wie wäre es damit: Alle Links durchsuchen und nachsehen ob auf den Zielseiten bestimmte Schlüsselwörter vorkommen? z.B. "Index of", "Last Modified" usw.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

... was ist, wenn die Zielreferrenz eine Datei ist?

Gut, man könnte den "content-type" im header prüfen, aber diesen - z.B: den Mimetypes abgebildet - mit zu übermitteln ist ebenfalls Sache des WebServers, und kein standard.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wir drehen uns wohl im Kreis... Egal wie man es macht, es ist immer nur eine Notlösung, weil so ein Listing einfach nicht dafür gemacht ist ;)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Einsiedlerkrebs
User
Beiträge: 9
Registriert: Dienstag 15. April 2008, 09:37

Masaru, anhand der relativen Pfade kann man doch eben viel besser die Verzeichnisse auslesen.
Wenn, wie auf der Beispielseite ein link auf 1.5.1/ zeigt, dann ist es klar dass das ein Unterordner von dem aktuellen Ordner ist.
Die restlichen Links führen extern und sind absolut angegeben.
Interne Links wie z. B. /contacts können absolut, oder relativ von der Webseitenroot angegeben worden sein. Anders kann das ja nicht gehen.

Man ist z. B. auf: http://repo.exist.com/dist/maestro/

href="1.5/" ist ein unterverzeichnis http://repo.exist.com/dist/maestro/1.5/
href="../" ist eins drüber http://repo.exist.com/dist/
href="/impressum" führt dann auf http://repo.exist.com/impressum/ und hat mit dem Verzeichnisbaum nichts mehr zu tun, wegen dem / davor.

Ein Browser macht baut sich seine Links mit diesen relativen angaben ja auch dann selber zusammen.
Antworten