urllib2.open ошибка в питоне - PullRequest
0 голосов
/ 25 августа 2018

Я не могу получить URL

base_url = "http://status.aws.amazon.com/"
    socket.setdefaulttimeout(30) 
htmldata = urllib2.urlopen(base_url)
for url in parser.url_list:
        get_rss_th = threading.Thread(target=parser.get_rss,name="get_rss_th", args=(url,))
get_rss_th.start()

    print htmldata

<addinfourl at 140176301032584 whose fp = <socket._fileobject object at 0x7f7d56a09750>>

при указании htmldata.read() ( Ошибка Python при использовании urllib.open )

и затем пустой экран

python 2.7

весь код: https://github.com/tech-sketch/zabbix_aws_template/blob/master/scripts/AWS_Service_Health_Dashboard.py

Проблема в том, что из URL-ссылки (RSS-канал) я не могу получить выходные данные (данные) переменная data = zbx_client.recv (4096) пусто - нет статуса

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

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


Сначала вы сделали это:

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
0 голосов
/ 25 августа 2018

Если я использую этот код:

import urllib2
import socket
base_url = "http://status.aws.amazon.com/"
socket.setdefaulttimeout(30)
htmldata = urllib2.urlopen(base_url)
print(htmldata.read())

, я получаю HTML-код страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...