Выходная кодировка Python - PullRequest
0 голосов
/ 23 июня 2018

Код представлен ниже. Работает с python 2 в Debian 9.

# -*- coding: utf-8 -*- 
import requests
import bs4

# repairing invalid HTML
s = requests.get('http://vstup.info/2017/i2017i483.html')
tmp = s.text.replace("</td></tr></td></tr><tr><td>", "</td></tr><tr><td>")

bs = bs4.BeautifulSoup(tmp, "html.parser")

content = bs.find("div", {"id": "okrArea"}).find("table", {"id": "about"}).findAll("tr")

typ = content[1].findAll("td")[1].get_text() #ZVO type

print typ
print [typ]

Это выводит это:

ТеÑ
нÑкÑм (ÑÑилиÑе)
[u'\xd0\xa2\xd0\xb5\xd1\x85\xd0\xbd\xd1\x96\xd0\xba\xd1\x83\xd0\xbc (\xd1\x83\xd1\x87\xd0\xb8\xd0\xbb\xd0\xb8\xd1\x89\xd0\xb5)']
  1. Почему выходные данные переменной печати отличаются от этой переменной в списке?
  2. Как получить правильное значение с веб-страницы

Технікум (училище)

В интерактивном питоне это можно получить из кодов с обратной косой чертой таким образом

>>> print '\xd0\xa2\xd0\xb5\xd1\x85\xd0\xbd\xd1\x96\xd0\xba\xd1\x83\xd0\xbc (\xd1\x83\xd1\x87\xd0\xb8\xd0\xbb\xd0\xb8\xd1\x89\xd0\xb5)'.decode('utf8')
Технікум (училище)

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Вы допустили ошибку, доверяя набору символов содержимого HTTP, установленному сервером, используя response.text.Это дает вам текст Unicode, декодированный из двоичных данных ответа, используя информацию заголовка, что здесь неверно.Затем вы передаете строку Unicode в BeautifulSoup, которая предполагает, что она была правильно декодирована.

Вместо этого используйте атрибут response.content, который дает вам тело содержимого необработанной двоичной строки:

tmp = s.conent.replace("</td></tr></td></tr><tr><td>", "</td></tr><tr><td>")

Теперь данные остаются в виде двоичной строки, и BeautifulSoup выполнит декодирование за вас,на основе информации в самом документе HTML (там есть тег <meta> с правильной информацией о кодеке):

>>> import requests, bs4
>>> s = requests.get('http://vstup.info/2017/i2017i483.html')
>>> tmp = s.content.replace("</td></tr></td></tr><tr><td>", "</td></tr><tr><td>")
>>> bs = bs4.BeautifulSoup(tmp, "html.parser")
>>> content = bs.select("div#okrArea table#about tr")
>>> typ = content[1].findAll("td")[1].get_text()
>>> print typ
Технікум (училище)
0 голосов
/ 23 июня 2018

Использовать кодировку latin1

Ex:

import requests
import bs4

s = requests.get('http://vstup.info/2017/i2017i483.html')
tmp = s.text.replace("</td></tr></td></tr><tr><td>", "</td></tr><tr><td>")

bs = bs4.BeautifulSoup(tmp, "html.parser")

content = bs.find("div", {"id": "okrArea"}).find("table", {"id": "about"}).findAll("tr")

typ = content[1].findAll("td")[1].get_text() #ZVO type

print typ.encode("latin1")

Выход:

Технікум (училище)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...