URL ходок дерева в Python?

Для URL, которые показывают деревья файлов, такие как пакеты Pypi, есть небольшой сплошной модуль для обхода дерева URL и перечисления его как ls -lR?
Я понял (поправьте меня), что нет стандартной кодировки атрибутов файлов, типов ссылок, размера, даты... в html <A атрибуты
так что построить твердый модуль URL tree на движущихся песках сложно.
Но наверняка это колесо (Unix file tree -> html -> treewalk API -> ls -lR or find) было сделано?
(Кажется, есть несколько пауков / веб-сканеров / скребков, но они пока выглядят уродливо и нерегулярно, несмотря на BeautifulSoup для разбора).

3 ответа

Серверы Apache очень распространены, и у них есть относительно стандартный способ перечисления файловых каталогов.

Вот достаточно простой скрипт, который делает то, что вы хотите, вы должны быть в состоянии заставить его делать то, что вы хотите.

Использование: python list_apache_dir.py

import sys
import urllib
import re

parse_re = re.compile('href="([^"]*)".*(..-...-.... ..:..).*?(\d+[^\s<]*|-)')
          # look for          a link    +  a timestamp  + a size ('-' for dir)
def list_apache_dir(url):
    try:
        html = urllib.urlopen(url).read()
    except IOError, e:
        print 'error fetching %s: %s' % (url, e)
        return
    if not url.endswith('/'):
        url += '/'
    files = parse_re.findall(html)
    dirs = []
    print url + ' :' 
    print '%4d file' % len(files) + 's' * (len(files) != 1)
    for name, date, size in files:
        if size.strip() == '-':
            size = 'dir'
        if name.endswith('/'):
            dirs += [name]
        print '%5s  %s  %s' % (size, date, name)

    for dir in dirs:
        print
        list_apache_dir(url + dir)

for url in sys.argv[1:]:
    print
    list_apache_dir(url) 

Другие рекомендовали BeautifulSoup, но гораздо лучше использовать lxml. Несмотря на свое название, он также предназначен для анализа и очистки HTML. Это намного, намного быстрее, чем BeautifulSoup. Он также имеет API совместимости для BeautifulSoup, если вы не хотите изучать API lxml.

Ян Бликинг соглашается.

Больше нет смысла использовать BeautifulSoup, если только вы не работаете в Google App Engine или где-то, где нет ничего, кроме Python.

У него также есть CSS-селекторы, так что подобные вещи тривиальны.

Оказывается, что однострочники BeautifulSoup могут превращать строки

в Python -

from BeautifulSoup import BeautifulSoup

def trow_cols( trow ):
    """ soup.table( "tr" ) -> <td> strings like
        [None, u'Name', u'Last modified', u'Size', u'Description'] 
    """ 
    return [td.next.string for td in trow( "td" )]

def trow_headers( trow ):
    """ soup.table( "tr" ) -> <th> table header strings like
        [None, u'Achoo-1.0-py2.5.egg', u'11-Aug-2008 07:40  ', u'8.9K'] 
    """ 
    return [th.next.string for th in trow( "th" )]

if __name__ == "__main__":
    ...
    soup = BeautifulSoup( html )
    if soup.table:
        trows = soup.table( "tr" )
        print "headers:", trow_headers( trows[0] )
        for row in trows[1:]:
            print trow_cols( row )

По сравнению с регулярным выражением sysrqb, приведенным выше, это... длиннее; кто это сказал

"Вы можете анализировать некоторые html-сообщения все время или html-файлы все время, но не..."

Другие вопросы по тегам