首页 > 解决方案 > 在循环中使用请求提供的 HTML 与在循环外使用请求不同

问题描述

我正在尝试使用 Python 从网站上抓取历史汇率。如果我手动抓取网站:

url = "https://www.x-rates.com/historical/?from=USD&amount=1&date=2018-07-12"
page = requests.get(url, timeout=5)
soup = BeautifulSoup(page.content, "html.parser")
table = soup.find("tbody")

结果是我正在寻找的正确 HTML。

但是,如果我在这个循环中使用相同的块:

for d in date_generated:
    date = str(d).replace("00:00:00", "")
    url = "https://www.x-rates.com/historical/?from=USD&amount=1&date=" + date
    page = requests.get(url, timeout=5)
    soup = BeautifulSoup(page.content, "html.parser")
    table = soup.find("tbody")

    for i,x in zip(table.find_all("a"), table.find_all("td", class_="")):
        time.sleep(3)
        request += 1
        elapsed_time = time.time() - start_time
        print(i.text.strip(), x.text.strip())

我没有得到正确的 HTML 内容。生成的 URL 的工作,我得到一个 200 status_code 但是当它尝试使用表时,在第二个循环中返回一个 NoneType 对象,表明它从来没有得到我想要的 HTML(但如果我得到它,我会得到它)将其从循环中运行)。

对于那些询问的人,以下是日期的生成方式。

   start_time = time.time()
   start = datetime.datetime.strptime("2018-07-07", "%Y-%m-%d")
   end = datetime.datetime.strptime("2018-07-12", "%Y-%m-%d")
   date_generated = [start + datetime.timedelta(days=p) for p in range(0, (end- 
   start).days)]

标签: pythonbeautifulsouppython-requests

解决方案


为了这个答案,让我们说 的值d等于2018-07-07 00:00:00

尽管如此,当您运行时:

date = str(d).replace("00:00:00", "")

你忘记了 和 之间的2018-07-07空格00:00:00

因此,您应该将此行替换为:

date = str(d).replace(" 00:00:00", "")

希望这能解决你的问题:)


推荐阅读