Проблемы с Python 2.6 и 3.2 подпрограммы urlopen на Windows - PullRequest
1 голос
/ 15 ноября 2011

Раньше в python 2.6 я много использовал urllib.urlopen для захвата содержимого веб-страницы, а затем для последующей обработки полученных данных.Теперь эти подпрограммы и новые подпрограммы, которые я пытаюсь использовать для Python 3.2, работают, как представляется, только для Windows (может быть, даже проблема только для Windows 7).

Использование следующего кода с Python 3.22 (64) в Windows 7 ...

import urllib.request

fp = urllib.request.urlopen(URL_string_that_I_use)

string = fp.read()
fp.close()
print(string.decode("utf8"))

Я получаю следующее сообщение:

Traceback (most recent call last):
  File "TATest.py", line 5, in <module>
    string = fp.read()
  File "d:\python32\lib\http\client.py", line 489, in read
    return self._read_chunked(amt)
  File "d:\python32\lib\http\client.py", line 553, in _read_chunked
    self._safe_read(2)      # toss the CRLF at the end of the chunk
  File "d:\python32\lib\http\client.py", line 592, in _safe_read
    raise IncompleteRead(b''.join(s), amt)
http.client.IncompleteRead: IncompleteRead(0 bytes read, 2 more expected)

Используя вместо этого следующий код ...

import urllib.request

fp = urllib.request.urlopen(URL_string_that_I_use)
for Line in fp:
    print(Line.decode("utf8").rstrip('\n'))
fp.close()

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

Traceback (most recent call last):
  File "TATest.py", line 9, in <module>
    for Line in fp:
  File "d:\python32\lib\http\client.py", line 489, in read
    return self._read_chunked(amt)
  File "d:\python32\lib\http\client.py", line 545, in _read_chunked
    self._safe_read(2)  # toss the CRLF at the end of the chunk
  File "d:\python32\lib\http\client.py", line 592, in _safe_read
    raise IncompleteRead(b''.join(s), amt)
http.client.IncompleteRead: IncompleteRead(0 bytes read, 2 more expected)

Попытка прочитать другую страницу приводит к ...

Traceback (most recent call last):
  File "TATest.py", line 11, in <module>
    print(Line.decode("utf8").rstrip('\n'))
  File "d:\python32\lib\encodings\cp1252.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\x92' in position
21: character maps to <undefined>

Я верю, что это проблема Windows, но можно ли сделать Python более устойчивым, чтобы справиться с причиной его возникновения?При попытке подобного кода (код версии 2.6) в Linux мы не сталкиваемся с проблемой.Это можно обойти?Я также отправил сообщение в группу новостей gmane.comp.python.devel

1 Ответ

2 голосов
/ 30 июня 2014

Похоже, что страница, которую вы читаете, была закодирована как cp1252.

import urllib.request

fp = urllib.request.urlopen(URL_string_that_I_use)

string = fp.read()
fp.close()
print(string.decode("cp1252"))

Должно работать.1010 * способов указать кодировку содержимого, но для большинства страниц достаточно использовать заголовок HTTP:

import urllib.request

fp = urllib.request.urlopen(URL_string_that_I_use)

string = fp.read().decode(fp.info().get_content_charset())
fp.close()
print(string)
...