Нет реальной проблемы с вашим кодом (за исключением множества ошибок отступов и синтаксических ошибок, которых явно нет в вашем реальном коде), только с вашими попытками его отладки.
Сначала вы сделали это:
print htmldata
Это прекрасно, но, поскольку htmldata
является urllib2
объектом ответа, при печати он просто печатает этот объект ответа. Который, по-видимому, выглядит так:
<addinfourl at 140176301032584 whose fp = <socket._fileobject object at 0x7f7d56a09750>>
Это не похоже на особо полезную информацию, но именно такой вывод вы получаете, когда печатаете что-то, что действительно полезно только для целей отладки. Он сообщает вам, какой это тип объекта, какой-то уникальный идентификатор для него и ключевые элементы (в данном случае, объект-сокет, завернутый в ответ).
Тогда вы, очевидно, пытались это сделать:
print htmldata.read()
Но уже вызывается read
на том же объекте ранее:
parser.feed(htmldata.read())
Когда вы read()
один и тот же файлоподобный объект дважды, первый раз получает все в файле, а второй раз получает все после всего в файле, то есть ничего.
То, что вы хотите сделать, - это read()
содержимое один раз в строку, а затем вы можете использовать эту строку столько раз, сколько захотите:
contents = htmldata.read()
parser.feed(contents)
print contents
Стоит также отметить, что, как указано в документации urllib2
вверху:
См. Также Пакет Requests
рекомендуется для высокоуровневого клиентского интерфейса HTTP.
Использование urllib2
может быть большой болью во многих отношениях, и это только одна из самых незначительных. Иногда вы не можете использовать requests
, потому что вам нужно копаться глубоко под прикрытием HTTP, или обрабатывать какой-то протокол, который он не понимает, или вы просто не можете установить сторонние библиотеки, поэтому urllib2
(или urllib.request
, так как он переименован в Python 3.x) все еще там. Но когда вам не нужно его использовать, лучше этого не делать. Даже сам Python в загрузчике ensurepip
использует requests
вместо urllib2
.
При requests
нормальный способ доступа к содержимому ответа - через свойства content
(для двоичного файла) или text
(для текста Unicode). Вам не нужно беспокоиться о том, когда read()
; он делает это автоматически для вас и позволяет вам снова и снова получать доступ к text
. Итак, вы можете просто сделать это:
import requests
base_url = "http://status.aws.amazon.com/"
response = requests.get(base_url, timeout=30)
parser.feed(response.content) # assuming it wants bytes, not unicode
print response.text