Создание словаря из файла XML с использованием Python и BeautifulSoup

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

Я пытаюсь получить информацию из файла 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)

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

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

Есть "Облако", "Дождь" и т. Д. И связанный с ним идентификационный номер, который просматривает stackru, я предполагаю, что это что-то вроде приведенного ниже кода, мне нужно будет создать словарь связанных номеров и идентификаторов, а затем считать до итераций.

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

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

2 ответа

Решение

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

#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")])

Ты можешь использовать xmltodict https://github.com/martinblech/xmltodict

xmltodict.parse("""
<?xml version="1.0" ?>
<person>
<name>john</name>
<age>20</age>
</person>""")
# {u'person': {u'age': u'20', u'name': u'john'}}`
Другие вопросы по тегам