Форум сайта python.su
def get_soup_by_url(current_url): page = requests.get(current_url) # Загрузим страницу page.encoding = 'utf-8' # Поставим верную кодировку soup = BeautifulSoup(page.text, "lxml") # Распознаем HTML-код return soup # Вернём готовый к использованию код def parse_table_to_list(soup): #создаем список из таблицы list_1 = [] for tr in soup.find_all("tr"): # ищем строки в таблице list_1.append(tr.find_all("td")) # записываем в список элементы строки return list_1 # Возвращаем полученный список в основную программу import requests from bs4 import BeautifulSoup base_url = input() lastname = input() result = input().split(",") current_page = '' current_url = base_url + current_page urls = [] # Создадим множество, где будем хранить адреса всех страниц сайта while True: soup = get_soup_by_url(current_url) urls.append(current_url) # Добавим адрес открытой страницы в множество адресов next_link = soup.find('a', text='Следующая таблица результатов') # Найдём тег с адресом новой страницы if not next_link: # Если ссылки на новую страницу нет break # — закончим поиск страниц, выйдя из цикла new_page = next_link.get('href') # Узнаем из этого тега адрес current_url = base_url + new_page # Подготовимся загружать новую страницу tables = [] for url in urls: # парсим и создаем список значений таблицы soup = get_soup_by_url(url) table = parse_table_to_list(soup) tables.append(table) new_tables = [] for i in range(len(tables)): # убираем пустые значения new_tables.append([value for value in tables[i] if value]) dict_list = [] for a in range(len(new_tables)): for b in range(len(new_tables[a])): # берем элементы из каждой строки и записывем в словарь line = new_tables[a][b] dict_1 = { "#": line[0].text, "Фамилия": line[1].text, "TSS": line[2].text, "TES": line[3].text, "PCS": line[4].text, "SS": line[5].text, "TR": line[6].text, "PE": line[7].text, "CO": line[8].text, "IN": line[9].text } dict_list.append(dict_1) l = [] for dict in dict_list: if lastname.lower() in dict.get("Фамилия").lower(): for res in result: l.append(dict.get(res)) print(*l[:len(urls)]) print(*l[len(urls):])
Отредактировано ks8191 (Март 20, 2021 12:01:56)
Прикреплённый файлы:
Снимок экрана 2021-03-20 в 12.52.21.png (177,5 KБ)
Офлайн
import requests import re from bs4 import BeautifulSoup # link = 'http://online.hse.ru/python-as-foreign/tasks/fs/example/' def get_soup(link): resp = requests.get(r''+ link) resp.encoding = 'utf-8' text = resp.text soup = BeautifulSoup(text,'lxml') return soup def get_value_from_soup(soup, find_name, args): table = soup.find('table') if table is None: return [] th = [i.text for i in table.find_all('th')] td = [[j.text for j in i.find_all('td')] for i in table.find_all('tr')[1:]] headers = {} for n, i in enumerate(th): headers[i] = n out = [] for i in td: if find_name.lower() in i[headers['Имя']].lower(): for arg in args: if arg in headers: out.append(i[headers[arg]]) return out def find_next_page(soup): target = soup.find('a', text='Следующая таблица результатов') if target is not None: return target.get('href') else: return False def process(link,name,args): out = [] soup = get_soup(link) values = get_value_from_soup(soup, name, args) if values: out.append(values) next_page = find_next_page(soup) if next_page: curent_page = ''.join(re.findall(r'(?!.*\/).+',link,0)) if curent_page: new_link = re.sub(curent_page, next_page, link) out +=process(new_link,name,args) else: new_link = link + next_page out += process(new_link,name,args) return out def main(): link = input() name = input() args = input().split(',') values = process(link, name, args) for i in values: print(' '.join(i)) if __name__ == '__main__': main()
http://online.hse.ru/python-as-foreign/tasks/fs/example/ Плисецкий TSS,IN,TES 82.27 8.40 41.02 59.29 5.75 30.69 Process finished with exit code 0
Офлайн
Спасибо огромное! Получилось)
xam1816
Офлайн