Форум сайта python.su
Прошу оценить выполнение задачи и высказать замечания.
Условие
“”“Упражнение ”Детские имена“
ЗАГС г. Москвы ведет статистику детских имен. На сайте этой организации
публикуется статистика наиболее популярных имен по году рождения ребенка.
Файлы для этого упражнения находятся в файлах ”babynames_boys.html“ и
”babynames_girls.html". Они содержат сырой HTML-код.
1. Создайте функцию extract_names(filename), которая принимает в качестве
аргумента имя файла и возвращает данные из него в виде словаря вида:
babynames = {
'София, Софья': ['3841 (6,0%)*', ‘3668 (6,2%)’, ‘2127 (4,8%)’,
‘826 (2,4%)’, ‘193 (0,4%)’,],
'Виктория': ,
…
}
Словарь использует в качестве ключа имя ребенка, а в качестве значения -
список, содержащий количесво детей, названных этим именем в соотв. году.
2. Создайте функцию print_names(). Функция получает в качестве аргумента
словарь babynames.Затем:
1. Запрашивает у пользователя интересующий его год.
2. Выводит на печать данные в алфавитном порядке имен:
Александра 1683
Алина 837
Алиса 1239
Алёна, Алена 658
Амина 243
Анастасия 3055 (5,1%)
…
Реализация
import re years = ['2012', '2010', '2005','2000','1990'] path = 'C:\\Users\\Админ\\Desktop\\Python\\lesson04\\babynames\\babynames_girls.html' def extract_names(filename): with open (filename, encoding='utf-8') as f: l = '' for line in f: l += line l = re.sub(r'\n', '', l) # удаление переносов строки и пробелов l = re.sub(r'\s{2,}', '', l) # в анализируемой HTML строке res = re.findall(r'>[^>]+<', l) # вытаскивает все строки между >< res = [x for x in res[:] if x != '> <'] # избавляемся от елементов '> <' for i in range(len(res)): # res[i] = res[i].replace('>', '') # '>text<' -> 'text' res[i] = res[i].replace('<', '') # см выше res = res[17:len(res)-1] # обрезает лишние элементы(заголовки таблицы) for i in reversed(range(len(res[:]))): #удаляет элементы с номером кратным 7 if i in [i for i in range(344) if i % 7 == 0]: #это порядковы номер строки таблицы res.pop(i) # babynames = {i: [] for i in res if res.index(i) % 6 == 0} #создание словаря с ключами - именами детей for key in babynames: #заполнение словаря элементами babynames[key] = [x for x in res if res.index(x) in [1,2,3,4,5]] #в виде списка чисел детей for i in range(6): #с именем-ключом и паралельное опустошение res.pop(0) # списка res для экономии памяти return babynames def print_names(babynames): while True: while True: print('В базе имеется информация за следующие годы' '\n', list(reversed(years)),sep='') inquiry = input('Введите интересующий Вас год. ' '\nДля выхода наберите exit.\n') if inquiry in years or inquiry == 'exit': break else: print('Введенный год отсутствует в базе') if inquiry == 'exit': break for i in sorted(babynames): print('%-16s' % i, ' : ', end='') print(babynames[i][years.index(inquiry)]) answer = input('Продолжить работу y/n? ') if answer != 'y': break print() print('==НАЧАЛО РАБОТЫ СКРИПТА==') babynames = extract_names(path) print_names(babynames) print('==ОКОНЧАНИЕ РАБОТЫ СКРИПТА==')
Отредактировано SomethingButNotNickName (Дек. 28, 2017 10:01:03)
Прикреплённый файлы: babynames_girls.html (25,9 KБ)
Офлайн
1) У тебя года должны из файла считываться, а не быть жёстко прописаны в коде.
2) Разбей через .split(“<tr>”) текст на список строк в цикле анализируй каждую строку. Так будет намного проще.
Офлайн
SomethingButNotNickName вы не ищете легких путей
from lxml import html htm = html.parse('babynames_girls.html') path = htm.xpath("//tr/descendant-or-self::*") for i in path: if i.tag == 'tr': print() else: print(i.text.strip(),end='\t')
Офлайн
vic57ModuleNotFoundError: No module named ‘lxml’
SomethingButNotNickName вы не ищете легких путей
Офлайн
это получено в результате того что у вас нет библиотеки lxml.
а теперь подробней. запускаете cmd от имени администратора прописываете в строке приглашения ввода
pip install lxml жмем ввод,ждем установку, пользуемся.
Офлайн
marvellik
это получено в результате того что у вас нет библиотеки lxml.а теперь подробней. запускаете cmd от имени администратора прописываете в строке приглашения вводаpip install lxml жмем ввод,ждем установку, пользуемся.
Офлайн