2016-07-27 13 views
0

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:

This is what I got

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:/

Antwort

1

Dies liegt daran, wenn Sie schreiben, Sie letzte Instanz Schleife beziehen, versuchen Sie dies:

writer.writerow((time, element['date'], element['time'], area, area['name'])) 
+0

Ich verstehe nicht, was du meinst "wenn du schreibst, du beziehst letzte Instanz der Schleife" Sorry! :/ – plzhelpmi

+0

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 –

+0

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

1

Das Problem in der Leitung ist: writer.writerow((time, element['date'], element['time'], area, name)), die name nie ändern.

Ein Weg, um es zu beheben:

try: 
    for index, area in enumerate(area_attrs_li): 
     # print str(area) + "\n" 
     writer = csv.writer(f) 
     writer.writerow((time, element['date'], element['time'], area, areas[index].get('name'))) 
finally: 
    f.close() 
+0

Was meinst du mit den Namen nie ändern? : x – plzhelpmi

1

Nach der Schleife Sie nur bekommen ein Wert in der Variablen name. Sie müssen eine Liste haben. versuchen, diese

areas = soup.select('area') 
name=[] 
for data in areas: 
    name.append(data.get('name')) 
    print name 
l=len(name) 

und in Versuch schließlich

i=0 
try: 
    for area in area_attrs_li: 
     writer = csv.writer(f) 
     writer.writerow((time, element['date'], element['time'], area, name[i])) 
     i=i+1 
+0

Oh, also muss ich eine Liste erstellen, genau wie ich eine erstellt habe, um den Bereich zu speichern? – plzhelpmi

+0

Ja, Sie haben immer wieder Variablen mit dem gleichen Wert geschrieben, weshalb Sie immer die letzte Eingabe erhalten haben. –