Использование urlib в цикле

#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