Скрипт, использующий библиотеку запросов, выдает ошибку «адаптеры не найдены» при попытке указать URL из таблицы Postgres - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь проверить правильность URL-адресов, хранящихся в базе данных Postgres, используя библиотеку requests в сценарии Python 3.x, но получаю следующую ошибку:

$ python3 test_urlvalid.py
Traceback (most recent call last):
  File "test_urlvalid.py", line 55, in <module>
    response = requests.get(row)
  File "...python3.7/site-packages/requests/api.py", line 75, in get
    return request('get', url, params=params, **kwargs)
  File "...python3.7/site-packages/requests/api.py", line 60, in request
    return session.request(method=method, url=url, **kwargs)
  File "...python3.7/site-packages/requests/sessions.py", line 533, in request
    resp = self.send(prep, **send_kwargs)
  File "...python3.7/site-packages/requests/sessions.py", line 640, in send
    adapter = self.get_adapter(url=request.url)
  File "...python3.7/site-packages/requests/sessions.py", line 731, in get_adapter
    raise InvalidSchema("No connection adapters were found for '%s'" % url)
requests.exceptions.InvalidSchema: No connection adapters were found for '('http://sampleurl.com',)'

Вотфрагмент моего скрипта:

dbconn = create_engine('postgresql+psycopg2://' + user + ':' + password + '@' + host + ':' + str(port) + '/' + database , echo=False)
dbconnraw = dbconn.raw_connection()
cur = dbconnraw.cursor()
cur.execute('SELECT email_domain_url FROM testurlsource')
rows = cur.fetchall()

for row in rows:
    response = requests.get(row)
    urlstat = response.status_code
    if urlstat<400:
        print('valid')
    else:
        print('invalid')

Строка, к которой относится код ошибки:

response = requests.get(row)

Поскольку последняя строка кода ошибки ссылается на %s в URL и '('http://sampleurl.com',)'так что это, вероятно, связано с преобразованием каждой записи таблицы в строку.

Возможно, мне нужно что-то изменить, чтобы символы "(),'" были удалены при подаче строк в сценарий.

Я пытался использоватьregex сделать последнее, но получил ошибку:

AttributeError: 'list' object has no attribute 'encode'

Любой совет?

1 Ответ

0 голосов
/ 08 февраля 2019

Если вы используете print(type(row)) в цикле for, вы можете обнаружить, что переменная row, вероятно, представляет собой tuple (или, возможно, list) с одним элементом внутри.Похоже, сообщение об ошибке указывает на ту же проблему.

Таким образом, вы можете попытаться передать этот элемент в вызов requests (вместо передачи всего tuple), изменив эту строку:

response = requests.get(row)

на это:

response = requests.get(row[0])
...