2009-03-26 13 views
3

Pypi packagesのようなファイルツリーを表示するURLの場合は、URLツリーを表示してls -lRのようにリストする小さなソリッドモジュールがありますか? ですか?
は私が集まる(私を修正)ので、シフト砂の上に固体URLtreeモジュールを構築
属性<A HTMLで...ファイル属性、 リンクの種類、サイズ、日付の標準的なエンコーディングがないという厳しいです。
確かにこのホイール(Unix file tree -> html -> treewalk API -> ls -lR or find) が完成しましたか?
(そこにはいくつかのスパイダー/ウェブクローラー/スクレーパーがあるようですが、これは解析のためにBeautifulSoupにもかかわらず、これまでのところ醜いものに見えます)。PythonのURLツリーウォーカーですか?

答えて

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) 
+0

sysrqbさん、ありがとうございました。誰がこれをどこで学んだでしょうか? また、サーバー上で$(unzip -l remote.zip)を実行し、ローカルファイルにパイプして大きなリモートファイルを一覧表示する方法はありますか? – denis

+0

実際、このことを読んだ人のために[この正規の答えはXML/HTMLを正規表現で解析する](http://stackoverflow.com/q/1732454)を覚えておいてください。また、数百人もの人々。この特定の状況では、apacheディレクトリのリスト形式は変わることはありませんが、ソフトウェアでは(特にUIに関係する)「何を意味すべきでない」べきかを知っています... –

+0

実際のパーサはより弾力的な解決策ですリスト形式への変更は、単純なパターンマッチングや適切な文法に基づいていても、スクレイパーを壊す傾向があります。 – rmmh

0

は、これらのようなBeautifulSoupワンライナーは、Pythonに<表>行を回すことができることが判明 - sysrqbの1行の正規表現と比較すると

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) 

上記、これは...長いです。

「あなたは、HTMLの一部 のすべての時間、またはHTMLのすべて のいくつかの時間を解析することはできませんが、...」

1

その他BeautifulSoupを推奨していると述べた しかし、lxmlを使用するほうがはるかに優れています。その名前にもかかわらず、HTMLの解析とスクラップ用です。それは、BeautifulSoupよりはるかに高速です。 lxml APIを習得したくない場合は、BeautifulSoup用の互換APIもあります。

Ian Blicking agrees

Google App Engineや純粋にPython以外のものがない限り、BeautifulSoupを使用する理由はありません。

CSSセレクタもありますので、この種のことは簡単です。

関連する問題