如何在Python中读取URL目录
我可以使用urllib模块来打开一个网址文件并读取它的内容。
>>> urllib.urlopen('file://localhost/tmp/foobar').read()
但是,这个方法不适用于目录——我想要读取(列出内容)一个网址目录。该怎么做呢?
补充说明:出于某种原因,我没能把这个问题解释清楚。我的意思是,我有一个网址(可以是任何东西,比如本地目录、远程目录、ftp://、http://或其他任何可以访问的目录),我能执行urllib.urlopen(目录中某个文件的网址).read(),并且它能正常工作。那么我的问题是,如何对这个目录本身做同样的事情,列出它的内容。
如果我能猜到网址目录中某个文件的名字,我就可以像上面那样访问到这个文件。然后我觉得应该有一种方法可以不需要猜测,直接获取文件列表。
我可以从1个字符的名字开始,进行(非常长的)搜索,询问所有这些名字,然后是所有2个字符的组合,依此类推。虽然这并不实际,但原则上表明我最终可以获取所有文件的名字。那么应该有一种更快的方法来做到这一点。
1 个回答
简单来说,是的,但建议使用requests库。
我会用requests
模块来举个例子,因为它比直接用urllib
要好得多,而且只需要三行代码。
我将使用这个链接作为例子,我觉得这就是你所说的“文件目录”。
>>> import requests
>>> r = requests.get('http://www.tulane.edu/~howard/SPAN-NLP/mp3/')
>>> print r.text
这个目录里有一系列播客。这里是r.text
的结果:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html>
<head>
<title>Index of /~howard/SPAN-NLP/mp3</title>
</head>
<body>
<h1>Index of /~howard/SPAN-NLP/mp3</h1>
<ul><li><a href="/~howard/SPAN-NLP/"> Parent Directory</a></li>
<li><a href="SPAN4350-01-Intro.MP3"> SPAN4350-01-Intro.MP3</a></li>
<li><a href="SPAN4350-02-CompLeng1.MP3"> SPAN4350-02-CompLeng1.MP3</a></li>
<li><a href="SPAN4350-03-ListasCadenas.MP3"> SPAN4350-03-ListasCadenas.MP3</a></li>
<li><a href="SPAN4350-04-Cadenas2.MP3"> SPAN4350-04-Cadenas2.MP3</a></li>
<li><a href="SPAN4350-05-Cadenas3.MP3"> SPAN4350-05-Cadenas3.MP3</a></li>
<li><a href="SPAN4350-06-Cadenas4.MP3"> SPAN4350-06-Cadenas4.MP3</a></li>
<li><a href="SPAN4350-09-UnicodeRegex.MP3"> SPAN4350-09-UnicodeRegex.MP3</a></li>
<li><a href="SPAN4350-10-Regex.MP3"> SPAN4350-10-Regex.MP3</a></li>
<li><a href="SPAN4350-11-Regextoken.MP3"> SPAN4350-11-Regextoken.MP3</a></li>
<li><a href="SPAN4350-12-NLTK.MP3"> SPAN4350-12-NLTK.MP3</a></li>
<li><a href="SPAN4350-13-NLTK_Control.MP3"> SPAN4350-13-NLTK_Control.MP3</a></li>
<li><a href="SPAN4350-14-Control2.MP3"> SPAN4350-14-Control2.MP3</a></li>
<li><a href="SPAN4350-15-Control3.MP3"> SPAN4350-15-Control3.MP3</a></li>
<li><a href="SPAN4350-16-Control4.MP3"> SPAN4350-16-Control4.MP3</a></li>
<li><a href="SPAN4350-17-Control5.MP3"> SPAN4350-17-Control5.MP3</a></li>
<li><a href="SPAN4350-18-ReciclarCodigo.MP3"> SPAN4350-18-ReciclarCodigo.MP3</a></li>
<li><a href="SPAN4350-19-Funciones.MP3"> SPAN4350-19-Funciones.MP3</a></li>
<li><a href="SPAN4350-21-Funciones2.MP3"> SPAN4350-21-Funciones2.MP3</a></li>
<li><a href="SPAN4350-22-ComputacionLeng.MP3"> SPAN4350-22-ComputacionLeng.MP3</a></li>
<li><a href="SPAN4350-23-ComputacionLeng2.MP3"> SPAN4350-23-ComputacionLeng2.MP3</a></li>
<li><a href="SPAN4350-24-ComputacionLeng3.mp3"> SPAN4350-24-ComputacionLeng3.mp3</a></li>
<li><a href="SPAN4350-25-ComputacionLeng4.MP3"> SPAN4350-25-ComputacionLeng4.MP3</a></li>
<li><a href="SPAN4350-26-ComputacionLeng5.MP3"> SPAN4350-26-ComputacionLeng5.MP3</a></li>
<li><a href="SPAN4350-27-Tuiter.MP3"> SPAN4350-27-Tuiter.MP3</a></li>
<li><a href="SPAN4350-30-Tuiter3.MP3"> SPAN4350-30-Tuiter3.MP3</a></li>
<li><a href="SPAN4350-31-Tuiter4.MP3"> SPAN4350-31-Tuiter4.MP3</a></li>
<li><a href="SPAN4350-32-Web.MP3"> SPAN4350-32-Web.MP3</a></li>
<li><a href="SPAN4350-33-Web2.MP3"> SPAN4350-33-Web2.MP3</a></li>
<li><a href="SPAN4352-34-Youtube.MP3"> SPAN4352-34-Youtube.MP3</a></li>
<li><a href="SPAN4352-35-Youtube2.MP3"> SPAN4352-35-Youtube2.MP3</a></li>
</ul>
</body></html>
如你所见,这基本上是目录中所有文件的HTML文档表示。你可以非常简单地使用正则表达式提取所有链接,然后逐个访问这些文件。
不过,这种方法只有在文件托管的地方配置为返回这种类型的文档时才能工作。大多数情况下是这样,但如果配置不同,我就不知道还有其他什么方法可以编程实现了。
另外,最好不要尝试用所有字符组合去暴力破解。还有更好的方法(一般来说,人们会用单词作为文件名,后面可能加个数字,而且这些单词通常和文件内容有关,所以如果你知道你在找什么,可以用这个来猜测等等)。