Мой Python не может работать с URL, и никто не может понять, почему? - PullRequest
0 голосов
/ 14 октября 2019

Все, что я хочу сделать, это собрать некоторые данные о землетрясениях с веб-сайта. На самом деле, я просто хочу, чтобы Python мог извлекать данные из URL. По какой-то причине даже самый простой код, который только открывает URL и использует «.readlines ()», встречает стену ошибок. Кажется, он не понимает команду «openurl» и ничего больше.

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

import urllib.request

def urltest():

url = "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.csv"
f = urllib.request.urlopen(url)
allLines = f.readlines()
f.close()
line = allLines[0].decode()
print(line)

Это код, который я использовал, чтобы просто протестировать его. URL-адрес идет на веб-сайт, который содержит файл .csv, который python должен легко получить и прочитать.

Если кто-то захочет, я могу опубликовать всю стену ошибок, которые возвращает этот код. Похоже, что есть как минимум 6 разных, но это последняя строка, которую он выплевывает:

urllib.error.URLError: <urlopen error unknown url type: https>

Ответы [ 3 ]

1 голос
/ 14 октября 2019

Просматривая модуль urllib.requests, он загружает коллекцию обработчиков. мы можем увидеть этот фрагмент кода в urllib.request.py

if hasattr(http.client, "HTTPSConnection"):
    default_classes.append(HTTPSHandler)
skip = set()
for klass in default_classes:
    for check in handlers:
        if isinstance(check, type):
            if issubclass(check, klass):
                skip.add(klass)
        elif isinstance(check, klass):
            skip.add(klass)
for klass in skip:
    default_classes.remove(klass)

for klass in default_classes:
    opener.add_handler(klass())

Таким образом, класс обработчика https загружается только в том случае, если http.client.py имеет атрибут HTTPSConnection. Если мы посмотрим в http.client.py, то увидим следующий код для установки этого атрибута:

try:
    import ssl
except ImportError:
    pass
else:
    class HTTPSConnection(HTTPConnection):
        "This class allows communication via SSL."

        default_port = HTTPS_PORT

Таким образом, класс HTTPSConnection создается только в том случае, если модуль ssl может быть успешно импортирован. Если в вашей системе нет модуля ssl, то http.client не будет загружать класс HTTPSConnection, который, в свою очередь, не добавит атрибут, и поэтому urllib не будет загружать обработчик для https.

Хотя предоставленный вами код работал в моей системе. Перед этим я добавил следующий код, чтобы моя система не смогла найти модуль ssl.

#load then remove the ssl module from the system
import sys
import ssl
del ssl
sys.modules['ssl']=None

import urllib.request


def urltest():

    url = "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.csv"
    f = urllib.request.urlopen(url)
    allLines = f.readlines()
    f.close()
    line = allLines[0].decode()
    print(line)

urltest()

При этом я получаю ту же ошибку, что и вы

C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\python.exe C:/Users/cd00119621/PycharmProjects/ideas/stackoverflow.py
Traceback (most recent call last):
  File "C:/Users/cd00119621/PycharmProjects/ideas/stackoverflow.py", line 19, in <module>
    urltest()
  File "C:/Users/cd00119621/PycharmProjects/ideas/stackoverflow.py", line 13, in urltest
    f = urllib.request.urlopen(url)
  File "C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 531, in open
    response = meth(req, response)
  File "C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 563, in error
    result = self._call_chain(*args)
  File "C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 755, in http_error_302
    return self.parent.open(new, timeout=req.timeout)
  File "C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 525, in open
    response = self._open(req, data)
  File "C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 548, in _open
    'unknown_open', req)
  File "C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "C:\Users\cd00119621\AppData\Local\Programs\Python\Python37\lib\urllib\request.py", line 1387, in unknown_open
    raise URLError('unknown url type: %s' % type)
urllib.error.URLError: <urlopen error unknown url type: https>

Так что я подозреваю, что вы установили python без настроенного ssl. Вы можете легко это проверить, просто попытавшись импортировать ssl из командной строки python import ssl, если вы получите сообщение об ошибке типа

>>> import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'ssl'

Тогда это станет причиной ваших проблем. Вам придется либо переустановить python с настроенным ssl, либо как-то собрать модуль ssl из исходного кода

0 голосов
/ 14 октября 2019

Вы можете использовать Панд:

import pandas as pd
data = pd.read_csv('http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_day.csv')
print (data)
0 голосов
/ 14 октября 2019

Похоже, что проблема связана с сетью (dns / proxy / firewall). https://github.com/pbugnion/gmaps/issues/245

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