Python中的URL树行者?

Python中的URL树行者?,python,tree,beautifulsoup,directory-walk,Python,Tree,Beautifulsoup,Directory Walk,对于显示文件树的URL,例如, 是否有一个小的实体模块来遍历URL树并像ls-lR那样列出它? 我推断(纠正我)没有标准的文件属性编码, 链接类型、大小、日期。。。在htmlhtml->treewalkapi->ls-lR或find中 已经完成了吗? (那里似乎有几个爬行器/网络爬虫器/刮板器,但到目前为止,它们看起来很难看,而且很特别,尽管在解析方面很漂亮)。Apache服务器非常常见,并且它们有一种相对标准的列示文件目录的方法 这里有一个足够简单的脚本,可以做你想做的事情,你应该能够让它做你

对于显示文件树的URL,例如, 是否有一个小的实体模块来遍历URL树并像
ls-lR
那样列出它?
我推断(纠正我)没有标准的文件属性编码, 链接类型、大小、日期。。。在html
html->treewalkapi->ls-lR或find中
已经完成了吗?

(那里似乎有几个爬行器/网络爬虫器/刮板器,但到目前为止,它们看起来很难看,而且很特别,尽管在解析方面很漂亮)。

Apache服务器非常常见,并且它们有一种相对标准的列示文件目录的方法

这里有一个足够简单的脚本,可以做你想做的事情,你应该能够让它做你想做的事情

用法:pythonlist\u apache\u 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) 
导入系统 导入URL库 进口稀土
parse_re=re.compile('href=“([^”]*)”*(…-…-…:)*?(\d+[^\s结果表明,像这样的漂亮的单行程序可以将行转换为Python--

从美化组导入美化组
def trow_cols(trow):
“”“soup.table”(“tr”)->字符串类似
[无,u'Name',u'Last modified',u'Size',u'Description']
""" 
返回[td.next.string for td in trow(“td”)]
def trow_收割台(trow):
“”“soup.table(“tr”)->表头字符串,如
[无,u'Achoo-1.0-py2.5.egg',u'11-Aug-2008 07:40',u'8.9K']
""" 
返回[th.next.string for th in trow(“th”)]
如果名称=“\uuuuu main\uuuuuuuu”:
...
soup=BeautifulSoup(html)
如果是soup.table:
trows=汤表(“tr”)
打印“标题:”,trow_标题(trows[0])
对于trows[1:]中的行:
打印trow_cols(行)
与上面sysrqb的一行regexp相比,这是…更长; 谁说的

“您可以解析所有html文件中的一些内容 时间,还是全部html的一些 时间,但不是……”


其他人建议使用BeautifulSoup,但它更好用。尽管它的名字叫BeautifulSoup,但它也用于解析和抓取HTML。它比BeautifulSoup快得多。如果你不想学习lxml API,它也有一个与BeautifulSoup兼容的API

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


它也有CSS选择器,所以这类事情很简单。

谢谢sysrqb,很好。从哪里学来的?还有,有没有办法运行$(unzip-l remote.zip)在服务器上,通过管道连接到本地文件,以列出大型远程文件?请记住,对于事后阅读此文件的任何人来说都很好。还有几百个其他文件。在这种特殊情况下,apache目录列表格式不应该更改,但我们都知道“不应该”在软件中的含义(特别是与UI相关的)…没错,一个真正的解析器将是一个更具弹性的解决方案,但对列表格式的任何更改都会打破刮刀——无论是基于简单的模式匹配还是正确的语法。
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 )