Wie in den vorherigen Fragen erwähnt, verwende ich Schöne Suppe mit Python, um Wetterdaten von einer Website abzurufen.Looping durch HTML-Tags mit BeautifulSoup
Hier ist, wie die Website aussieht:
<channel>
<title>2 Hour Forecast</title>
<source>Meteorological Services Singapore</source>
<description>2 Hour Forecast</description>
<item>
<title>Nowcast Table</title>
<category>Singapore Weather Conditions</category>
<forecastIssue date="18-07-2016" time="03:30 PM"/>
<validTime>3.30 pm to 5.30 pm</validTime>
<weatherForecast>
<area forecast="TL" lat="1.37500000" lon="103.83900000" name="Ang Mo Kio"/>
<area forecast="SH" lat="1.32100000" lon="103.92400000" name="Bedok"/>
<area forecast="TL" lat="1.35077200" lon="103.83900000" name="Bishan"/>
<area forecast="CL" lat="1.30400000" lon="103.70100000" name="Boon Lay"/>
<area forecast="CL" lat="1.35300000" lon="103.75400000" name="Bukit Batok"/>
<area forecast="CL" lat="1.27700000" lon="103.81900000" name="Bukit Merah"/>`
..
..
<area forecast="PC" lat="1.41800000" lon="103.83900000" name="Yishun"/>
<channel>
ich die Informationen abzurufen, habe ich es geschafft, diese Codes verwenden müssen:
import requests
from bs4 import BeautifulSoup
import urllib3
import csv
import sys
import json
#getting the Validtime
area_attrs_li = []
r = requests.get('http://www.nea.gov.sg/api/WebAPI/?
dataset=2hr_nowcast&keyref=781CF461BB6606AD907750DFD1D07667C6E7C5141804F45D')
soup = BeautifulSoup(r.content, "xml")
time = soup.find('validTime').string
print "validTime: " + time
#getting the date
for currentdate in soup.find_all('item'):
element = currentdate.find('forecastIssue')
print "date: " + element['date']
#getting the time
for currentdate in soup.find_all('item'):
element = currentdate.find('forecastIssue')
print "time: " + element['time']
#print area
for area in soup.select('area'):
area_attrs_li.append(area)
print area
#print area name
areas = soup.select('area')
for data in areas:
name = (data.get('name'))
print name
f = open("C:\\scripts\\testing\\testingnea.csv" , 'wt')
try:
for area in area_attrs_li:
#print str(area) + "\n"
writer = csv.writer(f)
writer.writerow((time, element['date'], element['time'], area, name))
finally:
f.close()
print open("C:/scripts/testing/testingnea.csv", 'rt').read()
ich es geschafft, die Daten in einer CSV zu bekommen, aber wenn ich führen Sie diesen Teil des Codes:
#print area name
areas = soup.select('area')
for data in areas:
name = (data.get('name'))
print name
Dies ist das Ergebnis:
Offenbar wird meine Schleife funktioniert nicht, da es den letzten Bereich des letzten Datensatz hält den Druck immer und immer wieder.
EDIT: Ich habe versucht, in der Liste durch die Daten für die Flächenschleifen:
for area in area_attrs_li:
name = (area.get('name'))
print name
jedoch sein Looping noch nicht.
Ich bin nicht sicher, woher die Codes falsch:/
Ich verstehe nicht, was du meinst "wenn du schreibst, du beziehst letzte Instanz der Schleife" Sorry! :/ – plzhelpmi
Wenn Sie schreiben (writer.writerow ((Zeit, Element ['Datum'], Element ['Zeit'], Bereich, Name))), hält die Variable Name den letzten Wert nach dem Schleifen des Bereichs Name, Sie kann infact löschen >> für den Bereich in area_attrs_li: name = (area.get ('name')) Druck Name, obwohl es auch funktioniert, für die Praxis können Sie versuchen, diese Schleife auch zu löschen –
Kann ich fragen, warum ist es wann ich put name bezieht sich auf die letzte instanz der loop aber es funktioniert ganz gut, wenn ich bereich? – plzhelpmi