python - 网络刮天气表
问题描述
我正在尝试网络抓取天气数据,并且需要获取表格并转换为 csv 格式。但并非表中的所有条目都填充了相同数量的列。所以当我以这种格式输入时
for h in airports:
for i in range(1,3):
if(i==1):
for j in range(1,32):
url="https://www.wunderground.com/history/airport/"+str(h)+"/2018/"+str(i)+"/"+str(j)+"/DailyHistory.html?req_city=&req_state=&req_statename=&reqdb.zip=&reqdb.magic=&reqdb.wmo="
www= urllib3.PoolManager()
page=www.urlopen("GET",url)
bs= BeautifulSoup(page.data,"lxml")
x=bs.find('div',{"class":"high-res"})
for tr in x.findAll('tr'):
weather.append([td for td in tr.stripped_strings])
else:
for k in range(1,29):
url="https://www.wunderground.com/history/airport/"+str(h)+"/2018/"+str(i)+"/"+str(k)+"/DailyHistory.html?req_city=&req_state=&req_statename=&reqdb.zip=&reqdb.magic=&reqdb.wmo="
www= urllib3.PoolManager()
page=www.urlopen("GET",url)
bs= BeautifulSoup(page.data,"lxml")
x=bs.find('div',{"class":"high-res"})
for tr in x.findAll('tr'):
weather.append([td for td in tr.stripped_strings])
输出的 csv 文件到处都是,逗号分隔的变量每个都进入一个新列,而与标题无关。有没有一种简单的方法可以做到这一点并以更清晰的方式获取日期?
所以我不断地附加一个带有表格行的列表,而不考虑列。如何确保列中的数据位于正确的标题下?
这就是我用来将数据写入 csv 文件的内容:
with open ('weather.csv','a') as file:
writer=csv.writer(file)
for row in weather:
writer.writerow(row)
解决方案
因此,以下人员似乎解决了我在正确的列标题下获取正确数据的问题:
for tr in x.findAll('tr'):
cols=tr.findAll('td')
cols=[ele.text.strip() for ele in cols]
weather.append([ele for ele in cols if ele])
result=pd.DataFrame(weather,columns=["Time(EST)","Temp.","Windchill","Dew Point","Humidity","Pressure","Visibility","Wind Dir","Wind Speed","Gust Speed","Precip","Events","Conditions"])
推荐阅读
- javascript - 如何使用 OpenCV.js 增加亮度?
- angular - 单选按钮禁用和启用取决于值 angular 6
- sql - 获取每个 id 的最新记录
- php - Laravel 5.6 在关系中应用枢轴范围
- c++ - macOS 上的 Qt GUI 应用程序:如何找到当前活动的屏幕?
- r - 在 deSolve 中延迟参数值/流入和流出速率
- azureservicebus - PeekLock Microsoft Azure 服务总线
- c# - 如何将依赖项注入 signalR 核心的集线器构造函数?
- c# - 来自 API 的多种返回类型
- json - Google Cloud Text-to-Speech 返回“INVALID_ARGUMENT”