Найти - Пользователи
Полная версия: открыть 2 сайта в питоне
Начало » Центр помощи » открыть 2 сайта в питоне
1
natalija96
Добрый вечер.
Помогите пожалуйста решить задание:

Есть сайт, который разделен на несколько страниц. 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.

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

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

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

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

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

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

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

Может, кто-то из новичков тебе и поможет, чтобы самому потренироваться. Программка-то хорошая и тренирует всё правильно.
crow
 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)
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