URL ходок дерева в Python?
Для URL, которые показывают деревья файлов, такие как пакеты Pypi, есть небольшой сплошной модуль для обхода дерева URL и перечисления его как ls -lR
?
Я понял (поправьте меня), что нет стандартной кодировки атрибутов файлов, типов ссылок, размера, даты... в html <A
атрибуты
так что построить твердый модуль URL tree на движущихся песках сложно.
Но наверняка это колесо (Unix file tree -> html -> treewalk API -> ls -lR or find
) было сделано?
(Кажется, есть несколько пауков / веб-сканеров / скребков, но они пока выглядят уродливо и нерегулярно, несмотря на BeautifulSoup для разбора).
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)
Другие рекомендовали BeautifulSoup, но гораздо лучше использовать lxml. Несмотря на свое название, он также предназначен для анализа и очистки HTML. Это намного, намного быстрее, чем BeautifulSoup. Он также имеет API совместимости для BeautifulSoup, если вы не хотите изучать API lxml.
Больше нет смысла использовать BeautifulSoup, если только вы не работаете в Google App Engine или где-то, где нет ничего, кроме Python.
У него также есть CSS-селекторы, так что подобные вещи тривиальны.
Оказывается, что однострочники BeautifulSoup могут превращать строки