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

http dir durchlaufen

Beitragvon fuppes » Mittwoch 7. Mai 2008, 10:36

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:

Beitragvon AlArenal » Mittwoch 7. Mai 2008, 10:59

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

Beitragvon Masaru » Mittwoch 7. Mai 2008, 20:31

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<<
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 7. Mai 2008, 22:03

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

Beitragvon Masaru » Mittwoch 7. Mai 2008, 22:20

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 8. Mai 2008, 08:44

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 ;)

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

Beitragvon Masaru » Donnerstag 8. Mai 2008, 09:35

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)
Kontaktdaten:

Beitragvon Aprilia » Donnerstag 8. Mai 2008, 09:37

http://de.selfhtml.org/

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

Beitragvon Masaru » Donnerstag 8. Mai 2008, 09:43

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

Beitragvon Aprilia » Donnerstag 8. Mai 2008, 09:50

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

Beitragvon Masaru » Donnerstag 8. Mai 2008, 09:55

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

Beitragvon Leonidas » Donnerstag 8. Mai 2008, 15:10

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 Modvoice
Benutzeravatar
Masaru
User
Beiträge: 425
Registriert: Mittwoch 4. August 2004, 22:17

Beitragvon Masaru » Donnerstag 8. Mai 2008, 15:32

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
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Freitag 9. Mai 2008, 08:13

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.

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

Beitragvon Masaru » Freitag 9. Mai 2008, 09:32

... 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.

Wer ist online?

Mitglieder in diesem Forum: __deets__, Bing [Bot], markjohannes