0

我正在使用列表“名称”中的变量从网站请求价值点:

names = ['A', 'B', 'C', 'D', 'E']

实际上,我在名称中的值比这多得多。

计划是遍历以下地址并像这样填写我的变量:

def get_values(name):
    res = requests.get('www.example.com/tb/' + name)

for name in names:
    get_values(name)

问题是,不同值的一部分地址更改为三个不同的值(tb、az 和 dm)(对于不同的名称,它们始终相同):

  • www.example.com/tb/A
  • www.example.com/tb/B
  • www.example.com/az/C
  • www.example.com/dm/D
  • www.example.com/dm/E

出于这个原因,在我上面的代码中,只下载了 A 和 B 的值。(并且将变量分配给名称是不切实际的,反之亦然。)

所以我获得正确 URL 的计划是用 if/else 来解决这个问题:

try:
    r = requests.get('www.example.com/tb/' + stock)
    if r.status_code == 200:
        url = 'www.example.com/tb/' + stock
    else:
        r = requests.get('www.example.com/az/' + stock)
        if r.status_code == 200:
            url = 'www.example.com/az/' + stock
        else:
            url = 'www.example.com/dm/' + stock
except:
    pass

correctUrl = requests.get(url)

这只会给我一个变量的值(例如 tz)。我还尝试使用 try 和 except 以及 try/except 和 if/else 的一些变体找到解决方案,但它不起作用。

如果有人能给我建议如何验证列表中每个名字的正确地址,那就太好了。或者什么是最pythonic的方式来做到这一点。不幸的是,我无法在 stackoverflow 或 google 上找到方法。

4

1 回答 1

1

您可以遍历可能的 url,直到获得代码200

def get_url(name):
    for sub in ('tb', 'az', 'dm'):
        url = f'www.example.com/{sub}/{name}'
        r = requests.get(url)
        if r.status_code == 200:
            return url
    return None    

for name in names:
    url = get_url(name)
    print(url)

显然,如果您可以将这些路径存储在您的名称中会更好,例如 [(tb, A), (tb, B), (az, C), ...]。但我假设你不能?

于 2019-02-04T16:29:26.050 回答