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()
如果我们将此函数分解,我们可以看到您需要执行以下几项操作:

  • 发送请求以获取网页内容
  • 将响应解析为HTML
  • 在结果树中搜索“a”标记
  • 从“a”标记的
    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()
    
    如果我们将此函数分解,我们可以看到您需要执行以下几项操作:

  • 发送请求以获取网页内容
  • 将响应解析为HTML
  • 在结果树中搜索“a”标记
  • 从“a”标记的
    href
    属性构造完整的文件路径
  • 在该位置下载文件
  • 我不知道有哪个模块会结合这些步骤。您的代码相对可读,我看不到任何低效之处。总之,我认为最大的错误是认为使用更少的行可以改进代码(至少在本例中是这样)。

    我将使用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:

    我将使用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
    是格式错误的链接时,它是否处理。