Найти - Пользователи
Полная версия: Помогите, пожалуйста, найти ошибку в парсинге
Начало » Python для новичков » Помогите, пожалуйста, найти ошибку в парсинге
1
ks8191
 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):])

Добрый день!
Решил задачу, но она не проходит скрытые тесты. С открытыми все нормально. Есть подозрение, что ошибка в том, как я вывожу итоговые значения . Но по-другому у меня не получается…

Тестовый ввод:
http://online.hse.ru/python-as-foreign/tasks/fs/example/
Плисецкий
TSS,IN,TES
xam1816
 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
ks8191
Спасибо огромное! Получилось)
xam1816
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB