首页 > 解决方案 > 无法以所需的方式从网页中获取两个字段

问题描述

我在 python 中创建了一个脚本来获取两个字段(第 2 列和第 3 列)timecurrency从位于网页中的表中获取。该脚本正在获取结果,但不是我希望的方式。

网站地址

到目前为止,我已经写过:

import requests
from bs4 import BeautifulSoup

URL = "https://www.forexfactory.com/calendar.php?week=this"

res = requests.get(URL)
soup = BeautifulSoup(res.text,"lxml")

for item in soup.select("tr.calendar_row"):
    ftime = item.select_one("td.calendar__time").get_text(strip=True)
    currency = item.select_one("td.calendar__currency").get_text(strip=True)
    print(ftime,currency)

我得到的结果:

All Day JPY
5:00am CNY
 CNY
2:00pm USD
1:59am JPY
2:00am EUR
 EUR
4:30am GBP
 GBP
 GBP

预期成绩:

All Day JPY
3:00pm CNY
3:00pm CNY
2:00pm USD
1:59am JPY
12:00pm EUR
12:00pm EUR
2:30pm GBP
2:30pm GBP
2:30pm GBP

我得到的时间与那个网站不同。此外,我希望用其较早的值填充空白时间

如何修改现有脚本以获取上面显示的结果?

标签: pythonpython-3.xweb-scraping

解决方案


问题是时间列中的空单元格

import requests
from bs4 import BeautifulSoup

URL = "https://www.forexfactory.com/calendar.php?week=this"

# Make cookie dictionary for setting timezones
cookies={
    "fftimezoneoffset":"0", #timezone / UTC +/-X
    "fftimeformat":"1", # format 0=am/pm / 1=24hour format
    "ffdstonoff":"1", # daylight saving
    "ffverifytimes":"1" # set times to timezone
}
res = requests.get(URL,cookies=cookies) # apply timezones
soup = BeautifulSoup(res.text,"lxml")
lastTime = "" #lastTime for cases with empty values for times
for item in soup.select("tr.calendar_row"):

    ftime = item.select_one("td.calendar__time").get_text(strip=True)
    if len(ftime) == 0: #if empty time use last one 
        ftime = lastTime
    lastTime = ftime
    currency = item.select_one("td.calendar__currency").get_text(strip=True)
    if len(currency) > 0: # print if there is currenty 
        print(ftime,currency)

推荐阅读