Основная выборка HTML-тела URL с помощью Python 3.x - PullRequest
3 голосов
/ 19 апреля 2011

Я новичок в Python.Меня немного смутили различия между старым urllib и urllib2 в Python 2.x и новым urllib в Python 3, и среди прочего я не уверен, когда нужно кодировать данные перед отправкой в ​​urlopen.

Я пытался извлечь html тело URL, используя POST, чтобы я мог отправлять параметры.На веб-странице отображаются данные о солнечном освещении для страны за определенный час данного дня.Я пытался без кодирования / декодирования и распечатка представляет собой строку байтов с b в начале.Код, который я тогда попробовал, был

import urllib.request, urllib.parse, urllib.error

def scrape(someurl):

    try:

        values = {'LANG': 'en',
                  'DATE' : '1303160400',
                  'CONT' : 'euro',
                  'LAND' : 'UK',
                  'KEY' : 'UK',
                  'SORT': '2',
                  'INT' : '06',
                  'TYPE' : 'sonnestd',
                  'ART' : 'karte',
                  'RUBRIK' : 'akt',
                  'R': '310',
                  'CEL': 'C'}

        data = urllib.parse.urlencode(values)
        data = data.encode("utf-8")
        response = urllib.request.urlopen(someurl, data)
        html = response.read().decode("utf-8")
        print(html)

    except urllib.error.HTTPError as e:
        print(e.code)
        print(e.read())

myscrape = scrape("http://www.weatheronline.co.uk/weather/maps/current")

Ошибка:

Traceback (most recent call last):
  File "/Users/Me/Desktop/weather.py", line 57, in <module>
    myscrape = scrape("http://www.weatheronline.co.uk/weather/maps/current")
  File "/Users/Me/Desktop/weather.py", line 37, in scrape
    html = response.read().decode("utf-8")
UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 10: invalid start byte

Без кодирования / декодирования я все равно получаю подозрительно короткую строку байтов, так что мне интересно, происходит ли сбой запроса вкаким-то другим способом

b'GIF89a\x01\x00\x01\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00!\xf9\x04\x01\x00\x00\x00\x00,\x00\x00\x00\x00\x01\x00\x01\x00\x00\x02\x02D\x01\x00;'

1 Ответ

2 голосов
/ 19 апреля 2011

GIF89a означает, что сервер отправляет вам изображение.

Кроме того, вы не должны в любом случае использовать UTF-8 методом прямого перебора; Вы должны посмотреть на заголовки ответа, чтобы выяснить, какую кодировку использовать.

...