2016-12-28 7 views
1

Bitte entschuldigen Sie meine Anfängerkenntnisse in Python. Ich muss BeautifulSoup verwenden, um über ein bestimmtes Element in einer XML-Datei zu iterieren.Erstellen eines Wörterbuchs aus einer XML-Datei mit Python und BeautifulSoup

Ich versuche, Informationen aus einer XML-Datei zu erhalten, die von einer Wetterwebsite erstellt wurde, jetzt speichere ich das XML so;

def aber_forcast(): 
    url = "http://api.met.no/weatherapi/locationforecast/1.9/?lat=52.41616;lon=-4.064598" 
    response = requests.get(url) 
    xml_text=response.text 
    soup= bs4.BeautifulSoup(xml_text, "xml") 
    f = open('file.xml', "w") 
    f.write(soup.prettify()) 
    f.close() 
    return (soup) 

Ich versuche, die Vorkommen auf das Element 'Symbol-ID' zu zählen. Ich muss ein Diagramm der Symbol-ID erstellen und wie oft es im gesamten XML auftritt. Ich kann es schaffen, alle symbol_id's in eine Liste zu bekommen.

with open ('file.xml') as file: 
    soup = bs4.BeautifulSoup(file, "xml") 
    symbol_id = soup.find_all("symbol") 
    print(symbol_id) 

Es gibt ‚Cloud‘, ‚Regen‘ usw. und eine zugehörige ID-Nummer, die mit ihm geht, durch Stackoverflow sah zu haben, ich nehme an, es so etwas wie den Code unten ist muss ich ein Wörterbuch erstellen Die zugehörigen Zahlen und IDs zählen dann die Iterationen.

def parseLog(file): 
    file = sys.argv[1] 
    handler = open(file).read() 
    soup = Soup(handler) 
    for sym in soup.findAll('symbol'): 
     msg_attrs = dict(sym.attrs) 
     f_user = sym.find('symbol id').user 
     f_user_dict = dict(f_user.attrs) 
     print ((f_user_dict[u'symbols'], sym.find('number').decodeContents()) 

Jede Hilfe oder Ratschläge wäre toll, sorry, wenn die Frage, die ich bin nicht viel Sinn machen noch neu zu all dies.

Antwort

1

Nicht ganz sicher verwenden, was Sie suchen, sondern eine einfache Iteration durch die Liste der Vorkommen der Ide zählen würde dies aussehen.

#get data 
url = "http://api.met.no/weatherapi/locationforecast/1.9/?lat=52.41616;lon=-4.064598" 
response = requests.get(url) 
xml_text=response.text 
soup= bs4.BeautifulSoup(xml_text, "xml") 
symbol_id = soup.find_all("symbol") 

# create dictionary 
d = {} 
for item in symbol_id: 
    d[item['id']] = d.get(item['id'], 0) + 1 

print(d) 

{'Cloud': 15, 
'Drizzle': 9, 
'DrizzleSun': 6, 
'LightCloud': 2, 
'LightRainSun': 2, 
'PartlyCloud': 13, 
'Rain': 1, 
'Sun': 18} 

Sie können dies auch mit Counter in einer Zeile tun

from collections import Counter 
Counter([x['id'] for x in soup.find_all("symbol")]) 
+0

, die genau so ziemlich das, was ich suche, sieht es so einfach, wenn Sie wissen, wie, nur eine einzige Zeile Code. Danke vielmals. :) –

+0

Kein Problem. Siehe die Antwort, die ich hinzugefügt habe. –

Verwandte Themen