Как исправить эту ошибку IOError: [Errno socket error] [Errno 11004]?

Этот простой скрипт Python 3:

import urllib.request

host = "scholar.google.com"
link = "/scholar.bib?q=info:K7uZdMSvdQ0J:scholar.google.com/&output=citation&hl=en&as_sdt=1,14&ct=citation&cd=0"
url = "http://" + host + link
filename = "cite0.bib"
print(url)
urllib.request.urlretrieve("http://scholar.google.com" + url, filename)

вызывает это исключение:

Traceback (most recent call last):
  File "C:/Users/ricardo/Desktop/Google-Scholar/BibTex/test2.py", line 8, in <module>
    urllib.request.urlretrieve("http://scholar.google.com" + url, filename)
  File "C:\Python32\lib\urllib\request.py", line 150, in urlretrieve
    return _urlopener.retrieve(url, filename, reporthook, data)
  File "C:\Python32\lib\urllib\request.py", line 1569, in retrieve
    fp = self.open(url, data)
  File "C:\Python32\lib\urllib\request.py", line 1541, in open
    raise IOError('socket error', msg).with_traceback(sys.exc_info()[2])
  File "C:\Python32\lib\urllib\request.py", line 1537, in open
    return getattr(self, name)(url)
  File "C:\Python32\lib\urllib\request.py", line 1715, in open_http
    return self._open_generic_http(http.client.HTTPConnection, url, data)
  File "C:\Python32\lib\urllib\request.py", line 1695, in _open_generic_http
    http_conn.request("GET", selector, headers=headers)
  File "C:\Python32\lib\http\client.py", line 967, in request
    self._send_request(method, url, body, headers)
  File "C:\Python32\lib\http\client.py", line 1005, in _send_request
    self.endheaders(body)
  File "C:\Python32\lib\http\client.py", line 963, in endheaders
    self._send_output(message_body)
  File "C:\Python32\lib\http\client.py", line 808, in _send_output
    self.send(msg)
  File "C:\Python32\lib\http\client.py", line 746, in send
    self.connect()
  File "C:\Python32\lib\http\client.py", line 724, in connect
    self.timeout, self.source_address)
  File "C:\Python32\lib\socket.py", line 386, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
IOError: [Errno socket error] [Errno 11004] getaddrinfo failed

Я могу нормально открыть URL-адрес, полученный в результате оператора print:

http://scholar.google.com/scholar.bib?q=info:K7uZdMSvdQ0J:scholar.google.com/&output=citation&hl=en&as_sdt=1,14&ct=citation&cd=0

Чем это вызвано? Я попытался изменить http:// на http:/// (три косые черты), но возникло такое же исключение.


person Ricardo Altamirano    schedule 17.07.2012    source источник


Ответы (1)


Вот ваша проблема:

urllib.request.urlretrieve("http://scholar.google.com" + url, filename)

Вы добавляете часть http://scholar.google.com дважды (url уже начинается http://scholar.google.com). Поэтому urillib думает, что вы запрашиваете страницу на scholar.google.comhttp -- разумеется, этого домена не существует. Это именно то, что говорит ваша ошибка.

Просто запросите url очевидно.

Удобный совет, чтобы быстрее находить подобные вещи в будущем: при добавлении оператора print для отладки обязательно печатайте фактическое значение, которое вы используете в отлаживаемой команде. Вы бы нашли это примерно за две секунды, если ваш оператор print также объединил базовый URL.

person kindall    schedule 17.07.2012
comment
Это исправляет ошибку IOError, но теперь я получаю ошибку ValueError: read of closed file. Я должен опубликовать новый вопрос, я так понимаю? Все, что я изменил, это удалить конкатенацию строк. - person Ricardo Altamirano; 18.07.2012
comment
Да, это совсем другая проблема. - person kindall; 18.07.2012