Seite 1 von 1

http dir durchlaufen

Verfasst: Mittwoch 7. Mai 2008, 10:36
von fuppes
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.

Verfasst: Mittwoch 7. Mai 2008, 10:59
von AlArenal
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.

Verfasst: Mittwoch 7. Mai 2008, 20:31
von Masaru
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<<

Verfasst: Mittwoch 7. Mai 2008, 22:03
von Leonidas
Das wird aber vermutlich an Lighttpd-Index Directories scheitern. Oder an SVN-Directories.

Verfasst: Mittwoch 7. Mai 2008, 22:20
von Masaru
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.

Verfasst: Donnerstag 8. Mai 2008, 08:44
von jens
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 ;)

Verfasst: Donnerstag 8. Mai 2008, 09:35
von Masaru
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<<

Verfasst: Donnerstag 8. Mai 2008, 09:37
von Aprilia
http://de.selfhtml.org/

schau mal da nach

Verfasst: Donnerstag 8. Mai 2008, 09:43
von Masaru
... worauf willst du hinaus Aprilia?

Verfasst: Donnerstag 8. Mai 2008, 09:50
von Aprilia
sry war der falsche link.....

sch... und der andere ist jetzt weg....
sry !!!

Verfasst: Donnerstag 8. Mai 2008, 09:55
von Masaru
^^ najut ... vielleicht findest Du den Link ja wieder und trägst ihn dann hier noch nach ;).

Verfasst: Donnerstag 8. Mai 2008, 15:10
von Leonidas
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.

Verfasst: Donnerstag 8. Mai 2008, 15:32
von Masaru
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.

Verfasst: Freitag 9. Mai 2008, 08:13
von jens
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.

Verfasst: Freitag 9. Mai 2008, 09:32
von Masaru
... 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.

Verfasst: Freitag 9. Mai 2008, 09:38
von jens
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 ;)

Verfasst: Samstag 10. Mai 2008, 00:32
von Einsiedlerkrebs
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.