2009-03-26 4 views
3

파일 트리를 표시하는 URL의 경우 Pypi packages, 에는 URL 트리를 걸러 내고 ls -lR과 같은 작은 솔리드 모듈이 있습니까?
<A 속성
의 파일 유형 속성에 대한 표준 인코딩이 없다는 것을 모았습니다. 시프트 샌즈에서 견고한 URLtree 모듈을 만드는 것은 어렵습니다.
물론이 휠 (Unix file tree -> html -> treewalk API -> ls -lR or find) 이 완료 되었습니까?
(거기에는 몇 개의 스파이더/웹 크롤러/스크래퍼가있는 것 같지만, 지금까지는 파싱에 대한 BeautifulSoup에도 불구하고보기 흉하고 특별했습니다.)파이썬에서 URL 트리 워커?

답변

3

Apache 서버는 매우 일반적이며 파일 디렉토리를 나열하는 비교적 표준 방법이 있습니다.

다음은 원하는대로 작업 할 수있는 간단한 스크립트로, 원하는 작업을 수행 할 수 있어야합니다.

사용법 : 파이썬 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로 한 - 라이너 파이썬으로> 행을 < 테이블을 설정할 수 있음을 밝혀 -

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의 한 줄의 정규 표현식에 비해 위에, 이것은 ... 더 길다;

1

기타 추천 한 BeautifulSoup로를 "당신은 ...하지만, 시간 의 일부를 모두에게 시간을 HTML의 일부를 구문 분석, 또는 HTML의 모든 수 있습니다"라고 사람 그러나 lxml을 사용하는 것이 훨씬 좋습니다. 그것의 이름에도 불구하고, 그것은 또한 HTML을 분석하고 긁는 것입니다. BeautifulSoup보다 훨씬 빠릅니다. lxml API를 배우고 싶지 않은 경우 BeautifulSoup에 대한 호환 API도 있습니다.

Ian Blicking agrees.

Google App Engine 또는 순수하게 Python이 허용되지 않는 것을 제외하고는 BeautifulSoup을 더 이상 사용할 필요가 없습니다.

CSS 선택기도 있습니다. 이런 종류의 일은 사소한 것입니다.

관련 문제