Python Сокет UTF-8 декодирования - PullRequest
0 голосов
/ 04 марта 2020

Я хочу получить ответ GET-запроса в строку, и я придумал следующий код:

import socket

target_host = "www.google.com"

target_port = 80  # create a socket object
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# connect the client
s.connect((target_host, target_port))

# send some data
request = "GET / HTTP/1.1\r\nHost:%s\r\n\r\n" % target_host
s.send(request.encode("utf-8"))
full_msg = ""

# Prevent recv() function to stop the script to wait until  it receives more data, even if there is no more.
s.settimeout(1)
flag = True

while flag:
    # receive some data
    try:
        response = s.recv(4096)
        full_msg = full_msg + str(response)
        print("Adding msg")
    except Exception as e:
        print(full_msg)
        flag = False
        print(e)

print("Loop ended")
print(type(full_msg))
Дело в том, что когда я пытаюсь декодировать ответ в s.recv (4096), заменяя его следующим кодом:

response = s.recv(4096).decode("utf-8")

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

'utf-8' codec can't decode byte 0xe8 in position 1025: invalid continuation byte

Я не знаю, как это исправить, так как не могу изменить символы, полученные из ответ и мне нужно удалить символ "b", который портит мою строку full_msg, если я не декодирую ее каждый раз в l oop.

Кроме того, в документах говорится, что .recv ( ) метод возвращает строку, но мне кажется, что я получаю байтовоподобный объект. Любая идея приветствуется, и я также открыт, чтобы узнать, как можно улучшить мой код.

1 Ответ

0 голосов
/ 04 марта 2020

За данные в вашем ответе Content-Type: text/html; charset=ISO-8859-1. Ответ не UTF-8. .decode('iso-8859-1') вместо. Еще лучше использовать запросы :

import requests
r = requests.get('https://www.google.com')
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)
# print(r.text)    # already decoded with r.encoding
# print(r.content) # byte string of original encoded data
# print(r.json())  # If the response is JSON data, This loads the data.
...