2

「http://」ヘッダーがない場合とない場合があるURLを開こうとすると、try-except別の内で使用しています。try-except

しかし、コードは乱雑に見えます。私は、Python がそのようなニーズに対処するためのより良い方法を持っているかどうか疑問に思っています。実際、私は「with」キーワードを読んだことがあります..どういうわけか、コードが読みにくくなると思います...

開くリンクがありますが、リンクに何かが欠けている可能性があります。たとえば、URLは次のようになります。xxx.com または http://xxx のいずれか。コム。http:// と url、http:// と www をテストする必要があります。プラス url、正しいものを見つけるための url。

どれも機能しない場合は、その理由を記録し、次のリンクに進む必要があります。

    for link in links:
        url = link
        if not url.startswith('http'):
            try:
                url1 = r'http://'+link
                res = requests.get(url)
            except Exception as e:
                try:
                    url2 = r'http://www.'+link
                    res = requests.get(url)
                except Exception as err:
                    self.print_error(*[url1, modify(e.message)])
                    self.print_error(*[url2, modify(err.message)])
                    self.error_log(*[url1, modify(e.message)])
                    self.error_log(*[url2, modify(err.message)])

        else:
            try:
                res = request.get(url)
            except Exception as e:
                self.print_error(*[url, modify(e.message)])
                self.error_log(*[url, modify(e.message)])
4

3 に答える 3

7

最初に、可能性のある URL のリストを優先順に組み立てます。

potential_urls = [link, 'http://' + link, 'http://www.' + link]

また、発生したエラーのリストを保持します。

errors_encountered = []

次に、リストを調べて、break機能するかどうかを確認します。

res = None
for url in potential_urls:
    try:
        res = requests.get(url)
    except Exception as err:
        errors_encountered.append(err)
    else:
        break

どの試行もうまくいかない場合は、必要に応じて検出してログに記録できるようにres設定したままにします。None

if res is None:
    for url, err in zip(potential_urls, errors_encountered):
        self.print_error(url, modify(err.message))
    for url, err in zip(potential_urls, errors_encountered):
        self.error_log(url, modify(err.message))

それ以外の場合は成功し、res通常どおり使用できます。

于 2014-08-15T05:38:27.410 に答える
0

これは、成功時にループを続行することでネストを単純に減らすもう 1 つの可能性です。

for link in links:
    url = link
    if not url.startswith('http'):
        try:
            url1 = r'http://'+link
            res = requests.get(url)
            continue # we succeeded
        except Exception as e:
            pass

        try:
            url2 = r'http://www.'+link
            res = requests.get(url)
        except Exception as err:
            self.print_error(*[url1, modify(e.message)])
            self.print_error(*[url2, modify(err.message)])
            self.error_log(*[url1, modify(e.message)])
            self.error_log(*[url2, modify(err.message)])
于 2014-08-15T05:46:20.473 に答える
0

@icktoofayの回答に似ていますが、リンクが成功したかどうかにかかわらず、おそらく作業する必要があるという観点から作業しています。

可能な試行を行い、リクエスト オブジェクトを返すか、すべての可能性を試行した後に例外を発生させる関数を定義します。

def try_get(link):
    for url in (link, 'http://' + link, 'http://www.' + link):
        try:
            return requests.get(url)
        except Exception:
            pass
    raise ValueError('no url was suitable', link)

次に、URL をループしres、例外に適した何かを使用または実行します。

for url in list_of_urls:
    try:
        res = try_get(url)
    except ValueError as e:
        print e
于 2014-08-15T05:47:39.143 に答える