Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 3, 2019 01:01:03

natalija96
Зарегистрирован: 2019-12-03
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

открыть 2 сайта в питоне

Добрый вечер.
Помогите пожалуйста решить задание:

Есть сайт, который разделен на несколько страниц. http://www.numbers.lv/RTU/files/
Питон должен сосчитать сумму чисел с 0 и 1 страницы.



Когда есть программа, в инпут нужно ввести 0 и 1 - открыть 0 и 1 первую страницу сайта и оутпут будет 22.39 - сумма с 0 и 1 страницы.

Program takes from keyboard numbers 0 and 1. Program reads all data from pages http://www.numbers.lv/RTU/files/page0.html and from http://www.numbers.lv/RTU/files/page1.html
Program sums up all data in all pages. The full precision result would be 22.393292731854853, but rounded number is 22.39.

Спасибо.

Офлайн

#2 Дек. 4, 2019 01:35:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

открыть 2 сайта в питоне

natalija96
Есть сайт, который разделен на несколько страниц.
Этот сайт с ошибками. Там нет закрывающего тега </font> по всей странице. Может, это и специально сделано. В реале сайты как раз не все идеальны и приходится работать с повреждёнными страницами.

Так что, думаю, разбирать его надо не через lxml, а через regexp'ы. lxml просто скажет “вижу повреждённую страницу и дальше работать не буду”, хотя там есть и какое-то игнорирование ошибок. Лучше regexp'ы использовать, так как они надёжнее и под полным контролем разработчика.

Что насчёт страниц, нужно использовать либо простенький в использовании requests, не входящий в библиотеку питона, либо сложненький в использовании модуль urllib.request, входящий в библиотеку питона. Я предпочитаю обычно urllib.request, так как он надёжнее и находится под контролем разработчиков самого питона - то есть никуда не денется в случае ухода автора.

Скачиваешь первую страницу, на ней отыскиваешь ссылки. Так как ссылки относительные, то конструируешь из них абсолютные ссылки. Затем создаёшь словарь из пар (номер, абсолютная ссылка), а дальше из этого словаря выбираешь для ключей 0 и 1 значения. Всё это делать надо по порядку в цикле. Потом в каждую ссылку заходишь всё тем же модулем для скачивания страницы и оттуда уже берёшь не ссылки, а числа как текстовые данные. Это важный этап, его нельзя пропускать, потому что часто числа на страницах записаны не так, как принято в языке их записывать, из-за чего требуется сначала выполнить конвертацию в правильный формат числа. Потом эти числа преобразуешь из текстового вида в числовой. И потом уже эти числа складываешь и результат запоминаешь (чтобы прибавить этот результата к результату со следующей страницы). Дальше у тебя результат есть, ты в цикле делаешь всё то же самое со следующей страницей и получаешь результат с неё. Потом результаты складываются. И потом происходит выход из цикла, так как все заданные страницы закончились и там уже выводится просуммированный результат со всех страниц.

Нужно понимать, что задание на 0 и 1 не является фиксированным и завтра тебе скажут вычислить для страниц 5, 8, 15, и 32 и не сумму, а разность. Поэтому программу нужно писать с учётом всех изменений в задании, которые могут возникнуть, чтобы сто программ не писать при каждом мелком изменении задачи.

Я представляю эту программу как набор функций в одном скрипте строк на сто.

Делать её всю за тебя я бы стал лет десять назад, чтобы самому научиться и потренироваться. Так и делал раньше и сейчас делаю, когда задание обнажает мои пробелы в знаниях. Но сегодня мне эта программа ничего в плане опыта не даст, как раньше дала бы.

Может, кто-то из новичков тебе и поможет, чтобы самому потренироваться. Программка-то хорошая и тренирует всё правильно.



Отредактировано py.user.next (Дек. 4, 2019 01:45:11)

Офлайн

#3 Фев. 18, 2020 16:57:32

crow
Зарегистрирован: 2020-02-18
Сообщения: 9
Репутация: +  2  -
Профиль   Отправить e-mail  

открыть 2 сайта в питоне

 import requests
import re
def clc(num):
    url = 'http://www.numbers.lv/RTU/files/'
    response = requests.get(url)
    pages = re.findall(r'page\d+',str(response.content))
    all_sum = []
    if num>len(pages):
        return 'EGOR: NUM > LEN PAGES'
    else:
        for i in range(num):
            tst = pages[i]
            tst_resp = requests.get(url+tst+'.html')
            tst_data = re.findall(r'[-+]?\d+\.\d+',str(tst_resp.content))
            for j in range(len(tst_data)):
                tst_data[j] = float(tst_data[j])
            all_sum.append(sum(tst_data))
    return(sum(all_sum))
clc(2)

Отредактировано crow (Фев. 18, 2020 16:59:46)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version