Альтернатива принятому ответу:
Используйте urllib.request
для Python 3
Если вы используете Python 3, не используйте urllib2
. Вместо этого используйте встроенный модуль urllib.request
(не нужно ничего устанавливать).
См. Примечания здесь :
Примечание. Модуль urllib2 разделен на несколько модулей в Python 3 с именами urllib.request и urllib.error. ,
Чтобы прочитать текст книги в переменную:
import urllib.request
book_url = "https://www.gutenberg.org/files/1661/1661-0.txt"
response = urllib.request.urlopen(book_url)
book_text = response.read().decode('utf-8')
Или распечатать всю книгу на терминал:
import urllib.request
book_url = "https://www.gutenberg.org/files/1661/1661-0.txt"
with urllib.request.urlopen(book_url) as f:
print(f.read().decode('utf-8'))
The requests
Пакет
Как отмечается в ответе, вы можете установить и использовать пакет requests
для интерфейса HTTP более высокого уровня. Тем не менее, он все еще должен обрабатывать кодировку явно:
import requests
book_url = "https://www.gutenberg.org/files/1661/1661-0.txt"
r = requests.get(book_url)
r.encoding = 'utf-8'
response = r.text
print(response)
Без явной инструкции по использованию UTF-8 результаты могут некорректно обрабатывать определенные символы, такие как так называемые умные / фигурные кавычки Microsoft. Вы можете получить что-то вроде этого ...
Lestrade laughed. âI am afraid that I am still a sceptic,â he said.
... когда вы должны получить это:
Lestrade laughed. “I am afraid that I am still a sceptic,” he said.
Почему требуется явное кодирование?
URL, к которому мы обращаемся, указывает на веб-страницу Project Gutenberg с текстом романа. Однако, когда я открываю эту страницу в своем браузере, данные отображаются неправильно. Например, я вижу это:
Lestrade laughed. “I am afraid that I am still a sceptic,†he said.
В верхней части веб-страницы мы видим следующее:
Title: The Adventures of Sherlock Holmes
Author: Arthur Conan Doyle
Release Date: November 29, 2002 [EBook #1661]
Last Updated: May 20, 2019
Language: English
Character set encoding: UTF-8
Итак, основная часть текста говорит нам, что страница, по-видимому, закодирована с использованием UTF-8.
Однако, если мы проверяем документ (например, с помощью инструментов «проверить элемент» Forefox), мы видим это:
<head>
<link rel="stylesheet" href="resource://content-accessible/plaintext.css">
</head>
Нет кодировка указано:
<meta charset="UTF-8">
Поэтому мы должны явно обрабатывать это сами, когда обрабатываем текст ответа. Это гарантирует, что Python будет правильно обрабатывать данные.
Как только данные покидают Python (например, если они записаны в файл или отображаются в терминале), тогда пользователям этих данных (например, считывателям файлов, дисплеям терминала) необходимо будет убедиться, что они также используют правильная кодировка при обработке данных.