Objective: I am trying to pull data from the Detailed forecast section on this weather forecast website. Then I am trying to put that data in a tabular data frame using pandas
Question: I get an error in the last line – could I get some advice, please?
This is my code thus far:
import csv
import requests
from bs4 import BeautifulSoup
from IPython.display import HTML
!pip install BS4
!pip install Requests
!pip install lxml
page = requests.get("https://forecast.weather.gov/MapClick.php? 
 lat=37.7772&lon=-122.4168#.Xx5gsZ5Kj51")
soup = BeautifulSoup(page.content, 'html.parser')
seven_day = soup.find(id="detailed-forecast")
forecast_items = seven_day.find_all(class_="panel-body")
tonight = forecast_items[0]
 print(tonight.prettify())
 period = tonight.find(class_="col-sm-2 forecast-label").get_text()
 short_desc = tonight.find(class_="col-sm-10 forecast-text").get_text()
 print(period)
 print(short_desc)
 period_tags = seven_day.select(".panel-body.col-sm-10 forecast-text")
 periods = [pt.get_text() for pt in period_tags]
 short_descs = [sd.get_text() for sd in seven_day.select(".panel-body .col-smtemps
  = [t.get_text() for t in seven_day.select(".tombstone-container .temp")
 import pandas as pd
 weather = pd.DataFrame({
 "period": period,
 "short_desc": desc,
  })
  weather
Advertisement
Answer
import requests
import pandas as pd
from bs4 import BeautifulSoup
page = requests.get("https://forecast.weather.gov/MapClick.php?lat=37.7772&lon=-122.4168#.Xx5gsZ5Kj51")
soup = BeautifulSoup(page.content, 'html.parser')
divs = soup.find("div", {"id":"detailed-forecast-body"})
period = []
desc = []
for div in divs.find_all("div", class_="row-forecast"):
    period.append(div.find("div", class_="forecast-label").get_text(strip=True))
    desc.append(div.find("div", class_="forecast-text").get_text(strip=True))
weather = pd.DataFrame({
"period": period,
"short_desc": desc,
})
print(weather)
Output:
period short_desc 0 Tonight Increasing clouds, with a low around 56. West ... 1 Monday Cloudy through mid morning, then gradual clear... 2 Monday Night Increasing clouds, with a low around 56. West ... 3 Tuesday Cloudy through mid morning, then gradual clear... 4 Tuesday Night Mostly cloudy, with a low around 56. West sout... 5 Wednesday Mostly cloudy, with a high near 67. 6 Wednesday Night Mostly cloudy, with a low around 56. 7 Thursday Partly sunny, with a high near 70. 8 Thursday Night Partly cloudy, with a low around 58. 9 Friday Sunny, with a high near 73. 10 Friday Night Mostly clear, with a low around 57. 11 Saturday Sunny, with a high near 74. 12 Saturday Night Mostly clear, with a low around 57. 13 Sunday Sunny, with a high near 73.
