Python中的URL树walker?

时间:2009-03-26 14:57:13

标签: python tree beautifulsoup directory-walk

对于显示文件树的网址,例如Pypi packages, 是否有一个小的实体模块来遍历URL树并将其列为ls -lR? 我收集(纠正我),没有文件属性的标准编码, 链接类型,大小,日期...在html <A属性中 因此,在移动的沙子上构建一个可靠的URL树模块是很困难的 但肯定是这个轮子(Unix file tree -> html -> treewalk API -> ls -lR or find) 已完成?
(似乎有几个蜘蛛/网络爬虫/刮刀,但到目前为止它们看起来很丑陋,尽管还有BeautifulSoup用于解析)。

3 个答案:

答案 0 :(得分: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) 

答案 1 :(得分:1)

其他人推荐使用BeautifulSoup,但使用lxml要好得多。尽管它的名字,它也用于解析和抓取HTML。它比BeautifulSoup快得多。如果您不想学习lxml API,它还有BeautifulSoup的兼容性API。

Ian Blicking agrees

没有理由再使用BeautifulSoup了,除非您使用的是Google App Engine或其他不允许使用Python的东西。

它也有CSS选择器,所以这种事情是微不足道的。

答案 2 :(得分:0)

事实证明,像这样的BeautifulSoup单行可以转向&lt; table&gt;行到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   时间,但不是......“