Невозможно прочитать хинди/деванагари с помощью запросов Python/модулей urllib

Я пытаюсь очистить это Веб-сайт NREGA, который содержит данные на хинди, т. е. на языке деванагари. Структура довольно легко царапается. Но когда я использую request/urllib для получения html-кода, текст на хинди преобразуется в какую-то тарабарщину. Однако текст отображается нормально в исходном коде сайта.

content = requests.get(URL).text

' 1 पी एस ' на сайте анализируется как ' 1 \xe0\xa4\xaa\xe0\xa5\x80 \xe0\xa4\x8f\xe0\xa4\xb8 ' в контент и отображается как тарабарщина, когда я пытаюсь экспортировать в csv.


person Nikhil Konatham    schedule 21.09.2020    source источник
comment
Вы можете загрузить файл Excel, указанный на веб-сайте, в основном вы можете автоматизировать процесс загрузки файла Excel с веб-сайта, который содержит все данные, вместо того, чтобы очищать и сохранять данные самостоятельно.   -  person Vin    schedule 21.09.2020
comment
@Vin Мне нужно собрать около 200 тысяч таких запросов.   -  person Nikhil Konatham    schedule 21.09.2020
comment
Да тоже не проблема. Как только вы создадите сценарий автоматизации с динамическим параметром, для которого вы хотите загрузить данные, он пойдет и загрузит этот файл Excel для вас. Я предполагаю, что в вашем случае динамическими значениями будут STATE, DISTRICT и BLOCK?   -  person Vin    schedule 21.09.2020
comment
Не могли бы вы рассказать мне, как вы переходите на страницу штата Раджастхан?   -  person Vin    schedule 21.09.2020
comment
@Vin Я использовал селен на родительском веб-сайте, чтобы извлечь все URL-адреса, которые я хочу очистить.   -  person Nikhil Konatham    schedule 22.09.2020
comment
Затем, используя селен, вы можете нажать кнопку ссылки на данные Excel, чтобы загрузить данные для каждого состояния, что является более быстрым способом извлечения данных вместо анализа всей таблицы для каждого сайта, и в вашем случае они находятся в 100-х годах.   -  person Vin    schedule 22.09.2020
comment
Мне нужно сделать другие вещи, которые лучше обрабатываются «запросами». Спасибо за ваши советы.   -  person Nikhil Konatham    schedule 22.09.2020


Ответы (1)


Ответ от сервера не указывает кодировку в заголовке Content-Type, поэтому запросы предполагают, что страница закодирована как ISO-8859. -1 (латиница-1).

>>> r = requests.get('https://mnregaweb4.nic.in/netnrega/writereaddata/citizen_out/funddisreport_2701004_eng_1314_.html')
>>> r.encoding
'ISO-8859-1'

На самом деле страница закодирована как UTF-8, как мы можем сказать, проверив атрибут apparent_encoding ответа:

>>> r.apparent_encoding
'utf-8'

или опытным путем:

>>> s = '1 \xe0\xa4\xaa\xe0\xa5\x80 \xe0\xa4\x8f\xe0\xa4\xb8'
>>> s.encode('latin').decode('utf-8')
'1 पी एस'

Правильный вывод можно получить, расшифровав атрибут content ответа:

>>> html = r.content.decode(r.apparent_encoding)
person snakecharmerb    schedule 21.09.2020
comment
@RickJames только с целью демонстрации того, что моджибаке в вопросе поддается декодированию. - person snakecharmerb; 24.09.2020