#python-3.x #urllib
#python-3.x #urllib
Вопрос:
Я пытаюсь написать простой скрипт на python, который проверяет код состояния определенного URL-адреса и выполняет необходимые действия на основе кода возврата. Для достижения этой цели я использую модуль urllib. Проблема с этим кодом заключается в том, что у меня есть разные отделы, определенные в списке (мне нужно выполнить итерацию по этому списку внутри urllib) Кажется, я не могу найти способ заменить / вставить элементы списка в цикл for.
import getopt, sys
import urllib.request
depts = [ 'support', 'edelivery', 'docs']
for dept in depts:
res = urllib.request.urlopen('https://dept.oracle.com').getcode()
print(res)
Я получаю следующую ошибку. Можем ли мы на самом деле перебирать список в модуле urllib в цикле?
#python3 reg_c_with_all.py
Traceback (most recent call last):
File "/usr/lib64/python3.7/urllib/request.py", line 1350, in do_open
encode_chunked=req.has_header('Transfer-encoding'))
File "/usr/lib64/python3.7/http/client.py", line 1277, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib64/python3.7/http/client.py", line 1323, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib64/python3.7/http/client.py", line 1272, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib64/python3.7/http/client.py", line 1032, in _send_output
self.send(msg)
File "/usr/lib64/python3.7/http/client.py", line 972, in send
self.connect()
File "/usr/lib64/python3.7/http/client.py", line 1439, in connect
super().connect()
File "/usr/lib64/python3.7/http/client.py", line 944, in connect
(self.host,self.port), self.timeout, self.source_address)
File "/usr/lib64/python3.7/socket.py", line 707, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
File "/usr/lib64/python3.7/socket.py", line 752, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "reg_c_with_all.py", line 6, in <module>
res = urllib.request.urlopen('https://dept.oracle.com').getcode()
File "/usr/lib64/python3.7/urllib/request.py", line 222, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib64/python3.7/urllib/request.py", line 525, in open
response = self._open(req, data)
File "/usr/lib64/python3.7/urllib/request.py", line 543, in _open
'_open', req)
File "/usr/lib64/python3.7/urllib/request.py", line 503, in _call_chain
result = func(*args)
File "/usr/lib64/python3.7/urllib/request.py", line 1393, in https_open
context=self._context, check_hostname=self._check_hostname)
File "/usr/lib64/python3.7/urllib/request.py", line 1352, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [Errno -2] Name or service not known>
Когда я запускаю его по отдельности, он возвращает код ответа, как и ожидалось.
>>> urllib.request.urlopen('https://support.oracle.com').getcode()
200
>>> urllib.request.urlopen('https://docs.oracle.com').getcode()
200
>>> urllib.request.urlopen('https://edelivery.oracle.com').getcode()
200
>>>
Комментарии:
1. Ваша трассировка отличается от вашего примера кода, в частности, тем, что в коде трассировки отсутствует «https://», что приводит к ошибке urllib.
2. @SuperStormer Спасибо за ваш комментарий. Это было потому, что я не публиковал свои фактические URL-адреса, с которыми я пытаюсь работать. В ошибке обратной трассировки я просто искал и заменял фактический URL-адрес тем, который я включил в приведенный выше пример и пропустил, чтобы добавить https. Сейчас я это исправил.
3. Похоже, проблема в вашем URL-адресе, потому что он не может открыться в браузере, и если я изменю его на другой URL, то код будет работать нормально
4. @Mr.ForExample Я изменил фактическое сообщение, чтобы включить рабочие URL-адреса, и оно по-прежнему терпит неудачу.
Ответ №1:
Ваш код перебирает отделы, но не использует их для изменения URL. Попробуйте использовать fstring для вставки значения dept
в URL-адрес:
import getopt, sys
import urllib.request
depts = [ 'support', 'edelivery', 'docs']
for dept in depts:
url = f'https://{dept}.oracle.com'
res = urllib.request.urlopen(url).getcode()
print(f'{url} => {res}')
Выходной сигнал:
https://support.oracle.com => 200 https://edelivery.oracle.com => 200 https://docs.oracle.com => 200