2016-03-24 9 views
1

のpythonのダウンロードWebページ内のすべてのファイル

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() 

しかし、私は少ないコード行でそれをどのように改善できるか、それが最高のものではないだと思いますか?

+0

ホスト名を抽出するためのURLを使用するようにコードを追加し、それをハードコーディングしないでください。 – lucky1928

+0

あなたの唯一の目的が行を少なくすることであるならば、 'python-requests'や' BeautifulSoup 4'や 'Scrapy'のような完全なツールセットのようなもっと現代的なライブラリを使うのと並んで他にはあまりないでしょう。しかし、これをスピードとエラーのどちらかに最適化したい場合は、 'runme'が非同期で実行されているか、' filelink'が不正なリンクであるかどうかを処理するかどうかということがまず必要です。 – woozyking

答えて

0

あなたが見つける呼び出す必要はありません、私は、URLに参加する urljoin を使用すると、あなたはのhrefを取得するだけでXPathを使用することができます。

別に私が使用することを好むだろうから
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)) 

リクエスト。あなたは非同期にしたい場合は

あなたがgrequests libが利用することができる:

import os 
import urllib 
from lxml import html 
from urlparse import urljoin 
import grequests 

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()) 
    reqs = (grequests.get((urljoin("http://standards.iso.org/", link))) for link in page.xpath("//a/@href")) 
    for resp in grequests.imap(reqs): 
     print(resp.content) 
0

Code Reviewの方がより良い質問です。要するに、コードは問題ありません。何かあれば、もっと多くの行を使いたいかもしれません。ここにいくつかを掃除しようとしています...しかし、私はラインを追加しました。私たちは、この機能を打破する場合

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() 

することは、我々はあなたがいくつかのことを行う必要があることがわかります。

  1. Webページの内容を取得するための要求を送信します。
  2. レスポンスをHTMLとして解析します。
  3. 結果のツリーで「a」タグを検索します。
  4. "a"タグのhref属性から完全なファイルパスを作成します。
  5. その場所にあるファイルをダウンロードします。

私は、これらのステップのいくつかを組み合わせるモジュールは認識していません。あなたのコードは比較的読みやすく、私は非効率性を見ません。要約すると、私は、最大の間違いは、少ない行を使用すると(少なくともこの場合は)コードが改善されると考えていると思います。

関連する問題