Можно ли посмотреть на данные в ответе urllib2? - PullRequest
1 голос
/ 21 августа 2009

Мне нужно определить кодировку символов в ответах HTTP. Для этого я смотрю на заголовки, а затем, если он не установлен в заголовке типа контента, я должен посмотреть ответ и найти заголовок "<meta http-equiv='content-type'>". Я хотел бы иметь возможность написать функцию, которая выглядит и работает примерно так:

response = urllib2.urlopen("http://www.example.com/")
encoding = detect_html_encoding(response)
...
page_text = response.read()

Однако, если я выполняю response.read () в моем методе "detect_html_encoding", то последующий метод response.read () после вызова моей функции завершится неудачей.

Есть ли простой способ просмотреть ответ и / или перемотать его после чтения?

Ответы [ 2 ]

4 голосов
/ 21 августа 2009
def detectit(response):
   # try headers &c, then, worst case...:
   content = response.read()
   response.read = lambda: content
   # now detect based on content

Хитрость, конечно, заключается в том, чтобы response.read() возвратил ту же самую вещь снова, если это необходимо ... поэтому мы присваиваем ей lambda при необходимости, т. Е. Если нам уже нужно было извлечь содержимое - то обеспечивает повторное извлечение одного и того же содержимого (и снова, и снова, ...; -).

0 голосов
/ 21 августа 2009
  1. Если он находится в заголовках HTTP (не в самом документе), вы можете использовать response.info() для определения кодировки
  2. Если вы хотите проанализировать HTML, сохраните данные ответа:

    page_text = response.read()
    encoding = detect_html_encoding(response, page_text)
    
...