2

версия Питона 3.4

я установил на ubuntu локальный сервер и все это работает через браузер. есть такой код:

#python 3.4
import urllib.request

url = 'http://ya.ru'
resp = urllib.request.urlopen(url)
respData = resp.read()
print(respData)

вся информация взятая из указанного сайта, на выходе(на браузере) отображаетя вот в таком формате:

b'
картикни(jpg, png, ...)
ссылки
кнопки и поля для заполнения
только вот вместо кирилицы показыет такую крякозябру \xd0\x9a\xd1\x83\xd0\xbf\xd0\xb8\xd1\x82\xd1\x8c
' 

все содержимое сайта как вы видите в ковычках а перед ковычками буква b (b' ') и текста очень много.

Моя цель. Получить только текст из указанного сайта. но вместо текста получаю крякозябры (\xd0\x9a\xd1\x83\xd0\xbf\xd0\xb8\xd1\x82\xd1\x8c)

Вопрос: как это исравить? учитывая что содержимое сайтов на входе будут на русском и на английских языках.

smajn
  • 35

2 Answers2

3

Нужно испосльзовать метод .decode() потому что respData является байт строка.

import urllib.request

url = 'http://example.com'
resp = urllib.request.urlopen(url)
respData = resp.read()
print(respData.decode())

Примера:

>>> b"\r\n\t\t\t\t\t\t \xd0\x9a\xd1\x83\xd0\xbf\xd0\xb8\xd1\x82\xd1\x8c \r\n\t\t\t\t\t".decode()
'\r\n\t\t\t\t\t\t Купить \r\n\t\t\t\t\t'

Я думаю, что вы бы хотели удалить пробелы тогда:

>>> b"\r\n\t\t\t\t\t\t \xd0\x9a\xd1\x83\xd0\xbf\xd0\xb8\xd1\x82\xd1\x8c \r\n\t\t\t\t\t".decode().strip()
'Купить'
Sede
  • 581
3

resp.read() возвращает двоичные данные (bytes), которые могут быть представлены в виде текста, используя b'..' константы (repr()). Чтобы получить текст (Unicode) необходимо знать соответствующую кодировку:

unicode_text = bytestring.decode(character_encoding)
bytestring = unicode_text.encode(character_encoding)

Не ясно, зачем выводить в консоль html-код веб-страницы, но если хочется:

#! /usr/bin/env python3
import io
import urllib.request
import shutil
import sys

url = 'http://ya.ru'
with urllib.request.urlopen(url) as r, \
    io.TextIOWrapper(r, encoding=r.headers.get_content_charset('utf-8')) as file:
    shutil.copyfileobj(file, sys.stdout)

Подробнее о том как узнать кодировку текста, возвращаемого http-сервером, см.: A good way to get the charset/encoding of an HTTP response in Python.


Если возникают проблемы с печатью Юникода на Винде, то установи win-unicode-console пакет, см.: Как из Python вывести на Windows-консоль строку в Юникоде? На других системах достаточно локаль настроить (см. LANG, LC_ALL, LC_CTYPE переменные окружения) например:

$ LC_ALL=C.UTF-8 python3 your-script.py
jfs
  • 52,361
  • Спасибо, много для себя полезного узнал в тех ссылках которые отправили, но сам код конкретно не решает проблему. – smajn Sep 20 '15 at 18:58
  • @smajn: в чём конкретно ошибка: "если запустить код (из ответа как есть), то он показывает ... вместо ожидаемых ...") (заполните многоточие, пожалуйста). – jfs Sep 20 '15 at 19:01
  • screenshot вот, ругается. вместо того чтобы показать содержимое страницы в читаемом виде. – smajn Sep 20 '15 at 20:06
  • 1
    @smajn: то что у Вас sys.stdout имеет ascii кодировку, указывает на сломанное окружение. На Ubuntu всё проще чем на Windows. Просто локаль настройте. Я обновил ответ. – jfs Sep 20 '15 at 20:16
  • все равно ругается(( . я написал в терминале: "LC_ALL=C.UTF-8 python3 your-script.py". а он выдает такую ошибку. can't open file 'your-script.py': [Errno 2] No such file or directory – smajn Sep 20 '15 at 20:36
  • @smajn: это уже у Вас третья проблема (первая: как получить текст из байтов, вторая: как Юникодный текст напечатать). Третья: your-script.py -- это просто пример (буквальный перевод с английского: ваша-программа.py) -- используйте настоящее имя файла, куда Вы сохранили код из ответа. – jfs Sep 20 '15 at 20:39