Найти - Пользователи
Полная версия: Запись html в файл
Начало » Python для новичков » Запись html в файл
1
zipsetic
Здравствуйте!

Вот есть небольшая проблемка с записью html кода web сайта в текстовый файл…

Программка запрашивает у пользователя url, затем спрашивает его о дальнейших действиях(функциях), одна из которых - запись html в текстовый файл

Ну вот собственно…

from urllib.request import urlopen
def page(url):
    '''
    Читает исходник из переданного аргумента(адреса)
    '''
    return urlopen(url).read() # Вернуть исходник
def printer():
    '''
    Выводит весь исходный код в командную строку
    '''
    print(get_url)
def record_file():
    '''
    Записывает исходник в файл
    '''
    f_url = open("%s %s" % (just,".txt"), "w") # Открыть текстовый файл для записи
    f_url.write(get_url) # Записать в файл исходник(из get_url)
    f_url.close # Закрыть
    
l_demo = [] # Создать пустой словарь
while 1: # Бесконечный цикл...
    try: 
        ent_url = input("Введите url адрес, в виде www.python.org...") # Запрос адреса 
        just = ent_url # Запомнить введенный адрес в переменной just
        l_demo.append(ent_url) # Добавить его в словарь
        print(l_demo, "Минутку...") # Вывести содержимое словаря и сообщение
        if l_demo[0][:7] == 'http://': # Если протокол введен...
            get_url = page(l_demo[0]) # Передать адрес функции page() и создать объект функции
            print("Все верно!!!!!!!") 
        else:
            fixed = "http://" + l_demo[0] # Если не введен, добавить путем создания новой переменной 
            get_url = page(fixed) # Так же передать адрес функции page()
            print("Ага!..")
        l_demo.remove(ent_url) # Удалить адрес из словаря
    except: # Адрес введен неверно
        print("Адрес не действителен!")
        
    rec_out = input("Записать исходник в файл или вывести тут? \nВведите для выбора: R/O")
    if rec_out == 'R':
        printer()
    else:
        record_file()
        

Проблема в том, что при попытке записи в файл, возникает ошибка:
TypeError: must be str, not bytes
Сам не могу разобраться, как исправить. Может кто знает, как решить задачу?

P. S.
В программе есть еще пара ошибок, а именно даже если введен неверный адрес, будут запрашиваться дальнейшие действия, но с этим я уж как-нибудь сам разберусь…

Всем спасибо за Ващи советы
reclosedev
Нужно или открыть файл в бинарном режиме (опция “wb”) и записывать в него “байты” (bytes) . Или открывать файл в текстовом режиме (“w”), но с указанием кодировки
open(filename, 'w', encoding='some-encoding')
и записывать сроку (str)
f.write(s.decode('utf8'))
Но в этом случае нужно знать кодировку страницы.

Ссылки по теме:
Py3k Unicode HOWTO
Погружение в Python 3 (Пилгрим)/Строки
zipsetic
reclosedev
Нужно или открыть файл в бинарном режиме (опция “wb”) и записывать в него “байты” (bytes) . Или открывать файл в текстовом режиме (“w”), но с указанием кодировки

open(filename, ‘w’, encoding='some-encoding')

и записывать сроку (str)

f.write(s.decode('utf8'))

Но в этом случае нужно знать кодировку страницы.

Спасибо Вам! Все работает!
Вот получилось как-то так:
#!/usr/bin/env python3
from urllib.request import urlopen
def page(url):
    '''
    Читает исходник из переданного аргумента(адреса)
    '''
    return urlopen(url).read() # Вернуть исходник
def printer():
    '''
    Выводит весь исходный код в командную строку
    '''
    print(get_url)
def record_file():
    '''
    Записывает исходник в файл
    '''
    f_url = open("%s %s" % (just,".txt"), "w", encoding='UTF-8') # Открыть текстовый файл для записи
    f_url.write(get_url.decode('utf-8')) # Записать в файл исходник(из get_url)
    f_url.close # Закрыть
    
l_demo = [] # Создать пустой словарь
while 1: # Бесконечный цикл...
    try: 
        ent_url = input("Введите url адрес, в виде www.python.org...") # Запрос адреса 
        just = ent_url # Запомнить введенный адрес в переменной just
        l_demo.append(ent_url) # Добавить его в словарь
        print(l_demo, "Минутку...") # Вывести содержимое словаря и сообщение
        if l_demo[0][:7] == 'http://': # Если протокол введен...
            get_url = page(l_demo[0]) # Передать адрес функции page() и создать объект функции
            print("Все верно!!!!!!!") 
        else:
            fixed = "http://" + l_demo[0] # Если не введен, добавить путем создания новой переменной 
            get_url = page(fixed) # Так же передать адрес функции page()
            print("Ага!..")
        l_demo.remove(ent_url) # Удалить адрес из словаря
    except: # Адрес введен неверно
        print("Адрес не действителен! Проверьте правильность ввода")
        l_demo.remove(ent_url)
        continue
        
    rec_out = input("Записать исходник в файл или вывести тут? \nВведите для выбора: R/O")
    if rec_out == 'R':
        printer()
    else:
        record_file()
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