【问题标题】:Basic question about parsing html using bs4 in python关于在python中使用bs4解析html的基本问题
【发布时间】:2022-02-13 07:19:20
【问题描述】:

我有一个关于 bs4 的简单问题,我似乎无法弄清楚。

作为参考,我是自学成才的,并且正在通过学​​习 python 排除故障。

所以基本上我正在进行的一个更大项目的一部分需要我抓取一个网站以获得 1 个月国库券的最新利率。我能够完成 99% 的任务,但其中一个方面我被卡住了。

基本上这些数据只在周一至周五更新。在当天或周末更新站点之前的上午 8 点运行此代码会返回错误。使用已更新的日期时,我可以获得所需的确切数据。

所以我将变量 d1、d2 和 d3 设置为今天、昨天和两天前。我想用我的 soup.find 搜索今天,如果没有搜索昨天,然后搜索两天前。

例如,在我的代码中,如果我使用 text=d3,我会得到一个返回值。

这是我现在所拥有的,非常感谢一些帮助!

from bs4 import BeautifulSoup
import requests
from datetime import date
import datetime

today = date.today()
d1 = today.strftime("%B %d, %Y")
ndays1 = datetime.timedelta(days = 1)
d2 = (today-ndays1).strftime("%B %d, %Y")
ndays2 = datetime.timedelta(days = 2)
d3 = (today-ndays2).strftime("%B %d, %Y")
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/71.0.3578.98 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'DNT': '1',  # Do Not Track Request Header
    'Connection': 'close'
}

url_rfr = "https://ycharts.com/indicators/1_month_treasury_rate"

response = requests.get(url_rfr, headers=headers, timeout=5).text
soup = BeautifulSoup(response, 'html.parser')

div = soup.find("td", text=d1 or d2 or d3).find_next_sibling("td").text.strip()

r = (float(div[:-1]))

print(r)

【问题讨论】:

  • 你想要的输出是什么?
  • 我的意思是如果你总是不想获得最近 3 天的价值或其他东西
  • 我唯一想要的结果是上次报告的浮动汇率,所以我可以在其他地方用它做一些计算
  • 我想搜索今天,如果不是今天,昨天,如果不是昨天,那么两天前是最好的路线
  • 那你为什么不把Last Value刮到Stats呢?

标签: python html parsing beautifulsoup


【解决方案1】:

因此,我将find(...) 中的text 更改为"Last Value",并添加了latest_period 以确保完整性

import datetime
from datetime import date

import requests
from bs4 import BeautifulSoup

today = date.today()
d1 = today.strftime("%B %d, %Y")
ndays1 = datetime.timedelta(days=1)
d2 = (today - ndays1).strftime("%B %d, %Y")
ndays2 = datetime.timedelta(days=2)
d3 = (today - ndays2).strftime("%B %d, %Y")

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/71.0.3578.98 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en-US,en;q=0.5',
    'DNT': '1',  # Do Not Track Request Header
    'Connection': 'close'
}

url_rfr = "https://ycharts.com/indicators/1_month_treasury_rate"

response = requests.get(url_rfr, headers=headers, timeout=5).text

soup = BeautifulSoup(response, 'html.parser')
latest_period = soup.find("td", text="Latest Period").find_next_sibling("td").text.strip()
value = soup.find("td", text="Last Value").find_next_sibling("td").text.strip()

val = (float(value[:-1]))

print(latest_period, val)  # Feb 11 2022 0.03

【讨论】:

  • 哇,这完美地回答并解决了我的问题。我意识到这可能有点简单,但我非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2016-04-05
  • 2013-06-09
  • 1970-01-01
  • 2018-12-03
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 2019-02-27
相关资源
最近更新 更多