python下载网页中的所有文件
我正在运行以下代码下载网页中的所有文件:python下载网页中的所有文件,python,Python,我正在运行以下代码下载网页中的所有文件: import os import urllib from lxml import html def main(): os.chdir("Downloads/") url = "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_IEC_14496-26_2010_Bitstreams/DVD1/mpeg4audio-conformance/compressedMp4/
import os
import urllib
from lxml import html
def main():
os.chdir("Downloads/")
url = "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_IEC_14496-26_2010_Bitstreams/DVD1/mpeg4audio-conformance/compressedMp4/"
page = html.fromstring(urllib.urlopen(url).read())
for link in page.xpath("//a"):
filelink = "http://standards.iso.org/" + link.get("href")
print "download",filelink
runme("wget " + filelink)
return
if __name__ == '__main__':
main()
但是我想这不是最好的,我怎样才能用更少的代码行来改进它呢?这可能是一个更好的问题。简而言之,您的代码很好。如果有的话,您可能需要使用更多的行。这是我试图清理它的一些。。。但我添加了一些行
import os
from urllib import urlopen, basejoin
from lxml import html
def main():
os.chdir('Downloads')
base_url = 'http://standards.iso.org'
page_url = basejoin(base_url,
'ittf/PubliclyAvailableStandards/'
'ISO_IEC_14496-26_2010_Bitstreams/'
'DVD1/mpeg4audio-conformance/compressedMp4/')
page_string = urlopen(page_url).read()
page_html = html.fromstring(page_string)
for link in page_html.getiterator('a'):
file_url = basejoin(base_url, link.get('href'))
if file_url.endswith('.mp4'):
print 'Downloading: {}'.format(file_url)
runme('wget {}'.format(file_url))
if __name__ == '__main__':
main()
如果我们将此函数分解,我们可以看到您需要执行以下几项操作:
href
属性构造完整的文件路径我不知道有哪个模块会结合这些步骤。您的代码相对可读,我看不到任何低效之处。总之,我认为最大的错误是认为使用更少的行可以改进代码(至少在这种情况下是这样)。这可能是一个更好的问题。简而言之,您的代码很好。如果有的话,您可能需要使用更多的行。这是我试图清理它的一些。。。但我添加了一些行
import os
from urllib import urlopen, basejoin
from lxml import html
def main():
os.chdir('Downloads')
base_url = 'http://standards.iso.org'
page_url = basejoin(base_url,
'ittf/PubliclyAvailableStandards/'
'ISO_IEC_14496-26_2010_Bitstreams/'
'DVD1/mpeg4audio-conformance/compressedMp4/')
page_string = urlopen(page_url).read()
page_html = html.fromstring(page_string)
for link in page_html.getiterator('a'):
file_url = basejoin(base_url, link.get('href'))
if file_url.endswith('.mp4'):
print 'Downloading: {}'.format(file_url)
runme('wget {}'.format(file_url))
if __name__ == '__main__':
main()
如果我们将此函数分解,我们可以看到您需要执行以下几项操作:
href
属性构造完整的文件路径import urllib
from lxml import html
from urlparse import urljoin
def main():
url = "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_IEC_14496-26_2010_Bitstreams/DVD1/mpeg4audio-conformance/compressedMp4/"
page = html.fromstring(urllib.urlopen(url).read())
for link in page.xpath("//a/@href"):
runme("wget " + urljoin("http://standards.iso.org/", link))
除此之外,我更喜欢使用请求
如果您想实现异步,可以使用lib:
我将使用urljoin来连接url,您可以只使用xpath来获取HREF,而无需调用find:
import urllib
from lxml import html
from urlparse import urljoin
def main():
url = "http://standards.iso.org/ittf/PubliclyAvailableStandards/ISO_IEC_14496-26_2010_Bitstreams/DVD1/mpeg4audio-conformance/compressedMp4/"
page = html.fromstring(urllib.urlopen(url).read())
for link in page.xpath("//a/@href"):
runme("wget " + urljoin("http://standards.iso.org/", link))
除此之外,我更喜欢使用请求
如果您想实现异步,可以使用lib:
添加代码以使用url提取主机名,不要硬编码。如果您的唯一目标是减少行数,那么除了可能使用一些更现代的库来帮助工作之外,就没有什么别的了,比如
python请求
和beautifulsoup4
,甚至是一些完整的工具集,比如Scrapy
。但是,如果您希望针对速度和/或更少的错误对此进行优化,那么我首先要问的是您的runme
是否异步执行,以及当filelink
是格式错误的链接时,它是否处理。添加代码以使用url提取主机名,不要硬编码。如果您的唯一目标是减少行数,除了可能使用一些更现代的库来辅助工作之外,没有什么别的了,比如python请求
和beautifulsoup4
,甚至还有一些完整的工具集,比如Scrapy
。但是,如果您希望针对速度和/或更少的错误对此进行优化,那么我首先要问的是,您的runme
是否异步执行,以及当filelink
是格式错误的链接时,它是否处理。