2016-12-28 8 views
1

Прошу извинить начальное знание Python. Мне нужно использовать BeautifulSoup для итерации по определенному элементу в файле XML.Создание словаря из XML-файла с использованием Python и BeautifulSoup

Я пытаюсь получить информацию из файла XML, созданного с веб-сайта погоды, сейчас я сохраняю XML как это;

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) 

Я пытаюсь подсчитать числа на символе элемента 'id. Мне нужно будет создать график идентификатора символа и сколько раз это происходит во всем XML. Я могу получить все символы symbol_id в один список;

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

Там являются «Облако», «Дождь» и т.д., и связанный с ним идентификационный номер, который идет с ним, посмотрев через StackOverflow, я предполагаю, что это что-то вроде кода ниже, мне нужно будет создать словарь связанные номера и идентификаторы затем подсчитывают итерации.

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()) 

Любая помощь или совет будет очень жаль, если вопрос не имеет смысла. Я все еще новичок во всем этом.

ответ

1

Не совсем уверен, что вы ищете, но простую итерацию по списку подсчета вхождений идентификаторов будет выглядеть следующим образом.

#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} 

Вы также можете сделать это в одной строке с Counter

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

Это в значительной степени именно то, что я ищу, это выглядит так легко, когда вы знаете, как, только одну строку кода. Большое спасибо. :) –

+0

Нет проблем. См. Один ответ, который я добавил. –