2016-07-25 7 views
0
auszugeben

Wie in der vorherigen Frage erwähnt, verwende ich Schöne Suppe mit Python, um Wetterdaten von einer Website abzurufen.Beautifulsoup in Tags zu extrahieren und als JSON

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"/>` 
<channel> 

ich die Informationen abzurufen, habe ich es geschafft, diese Codes verwenden müssen:

import requests 
from bs4 import BeautifulSoup 
import urllib3 
import json 


weather = [] 

#getting the time 

r = requests.get('http://www.nea.gov.sg/api/WebAPI/?dataset=2hr_nowcast&keyref=<keyrefno>') 
soup = BeautifulSoup(r.content, "xml") 
time = soup.find('validTime').string 
print "validTime: " + time 

for currentdate in soup.find_all('item'): 
element = currentdate.find('forecastIssue') 
print "date: " + element['date'] 

for currentdate in soup.find_all('item'): 
element = currentdate.find('forecastIssue') 
print "time: " + element['time'] 

for area in soup.find('weatherForecast').find_all('area'): 
print area 


#file writing 
with open("c:/scripts/nea.json", 'w') as outfile: 
json.dumps(weather, outfile) 
#outfile.write(",") 

Dies ist die Ausgabe Ich habe (in CMD):

C:\scripts>python neaweather.py              
2.30 pm to 4.30 pm                
date: 25-07-2016                
time: 02:30 PM                 
<area forecast="LR" lat="1.37500000" lon="103.83900000" name="Ang Mo Kio"/> 
<area forecast="LR" lat="1.32100000" lon="103.92400000" name="Bedok"/>   
<area forecast="LR" lat="1.35077200" lon="103.83900000" name="Bishan"/>  
<area forecast="LR" lat="1.30400000" lon="103.70100000" name="Boon Lay"/>  
<area forecast="LR" lat="1.35300000" lon="103.75400000" name="Bukit Batok"/> 
<area forecast="LR" lat="1.27700000" lon="103.81900000" name="Bukit Merah"/> 

Ich habe ein paar Fragen, die ich nicht sicher bin, wie zu lösen:

  1. Gibt es eine Möglichkeit, die Attribute in Bereich Prognose = "LR" lat = "1,37500000" lon = "103,83900000" name = "Ang Mo Kio"ohne seine Tags abrufen?

    Ich habe versucht, „.text“ zu meinen Codes hinzugefügt, aber es würde immer ein Fehler sein

  2. ich die Ausgabe in einem JSON-Format für meine Ausgabe sein möchte, da es nicht in einem Tabellenformat ist als gezeigt auf Anleitungen, wie eine JSON-Datei mit python zu erstellen:/

EDIT: ich habe es geschafft, die Daten in einer JSON-Datei zu öffnen, aber wie formatiere ich die Unicode-String in eine normale Zeichenfolge als die Ergebnis enthält u '?

+0

1. Ihre Frage ist nicht ganz klar, wie '' ist ein einzelnes Tag ('area') mit vielen ** Attributen ** (' prognose', 'lat',' lon', 'name'). 2. Auch nicht sehr klar. Wenn Sie ein JSON-Format haben möchten, können Sie es selbst analysieren und eine Ausgabe in einem JSON-Format erstellen. – DeepSpace

+0

Hallo, Entschuldigung für die Verwirrung. Ich möchte die Attribute der Gebietsvorhersage abrufen. Kann ich auch wissen, wie ich es im JSON-Format analysiere? Danke – plzhelpmi

+1

Sie können die AttrS Eigenschaft wie folgt nutzen: 'area_attrs_li = [area.attrs für den Bereich in supp.find ('weatherForecast'). Find_all ('area')]' –

Antwort

0

Versuchen Sie dies in Ihrem Code:

with open("nea.json",'a+') as fs: 
    for area in soup.find('weatherForecast').find_all('area'): 
     fs.write(str(area.attrs)) 
+0

Hallo, es funktioniert! :) aber kann ich wissen, wie habe ich eine zeile zwischen den einzelnen attributen in der json-datei? :) – plzhelpmi

+0

fügen Sie einfach ein "\ n" beim Schreiben der Datei, versuchen Sie es. – bhansa

+0

Sorry, das klingt vielleicht dumm, aber wo füge ich "\ n" hinzu? : x – plzhelpmi