3

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

4

3 回答 3

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) 
于 2009-03-26T19:21:33.507 回答
1

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

Ian Blicking 同意

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

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

于 2009-08-03T15:37:12.480 回答
0

事实证明,像这样的 BeautifulSoup 单行程序可以将 <table> 行转换为 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,但不能……”

于 2009-04-03T08:49:42.220 回答