python - 在循环中使用请求提供的 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)]
解决方案
为了这个答案,让我们说 的值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", "")
希望这能解决你的问题:)
推荐阅读
- java - 如何使用 pdfHtml 插件使用 iText 7 或 5 实现 Aztec-barcode?
- laravel - 在具有多个附加搜索过滤器的类似查询中使用数组
- python - 在栅格中查找方向变化的算法
- javascript - js树在处理选中/取消选中事件并将所有复选框设置为true时不起作用
- ios - 我什么时候应该屏蔽 UITableView 部分单元格的角?
- javascript - 我对步骤计数有疑问-reactjs 表单
- jquery - 在 HTML 页面或模板中使用 Django-REST-Framework 从 Django 中创建的 API 获取/显示 API 数据
- youtube-api - 如何增加 Youtube API 配额
- reactjs - 为什么在 gh-pages 上部署的 react 应用程序在不同的浏览器上显示空白页面,而在我的浏览器上正确显示?
- java - “如何从java中的字符串替换“[”?