2

Написал простой парсер погоды из яндекса, но если температура минусовая, то он выводит знак вопроса. Перепробовал много чего, но пока ничего не помогло. Прошу помочь. введите сюда описание изображения

Код(Python 3.7)

import urllib
from bs4 import BeautifulSoup


def ParseWeatherYandex(city):
    url = 'https://yandex.ru/pogoda/' + city
    page = urllib.request.urlopen(url).read()
    soup = BeautifulSoup(page, 'html.parser')

    #getting time now, temperature and condition
    day = soup.find('time', 'fact__time').contents
    temperature = soup.find('span', 'temp__value').contents
    weather_type = soup.find('div', 'link__condition day-anchor i-bem').contents

    #parsing feeling temperature
    t = soup.find('dl', 'term term_orient_h fact__feels-like')
    t = ((t.div).span).contents


    #joining lists in one
    feels = list(soup.find('dt', 'term__label').contents) + t


    print(day[0] + '\n' + 'Температура сейчас: '+ (temperature[0]).center(3), end='\n')
    print('Погода: %s' %weather_type[0], end=', ')
    print('%s %s' %(feels[0].lower(), feels[1]))



ParseWeatherYandex(input())

input()
input()
insolor
  • 49,104
HideME
  • 445
  • Может, с кодировкой консоли проблема? Если chcp 65001 написать, лучше не станет? –  Mar 20 '19 at 16:17
  • 1
    Копировал ваш код, заменив import urllib на import requests, soup = BeautifulSoup(requests.get(url).text, 'html.parser'), всё выдало правильно (подал на вход Tomsk, там сейчас минусовая :)). – Mikhail Murugov Mar 20 '19 at 16:19
  • Ну и как вариант в feels, наверное, строка лежит - можно проверять, является ли её первый символ цифрой (feels[0].isdigit()), если нет - то это какой-то дефис или тире, можно на отображающийся символ заменить, например, на собственно минус –  Mar 20 '19 at 16:20
  • @Anton я в питоне недавно, подскажите как попробовать кодировку в вашем сообщении – HideME Mar 20 '19 at 16:23
  • @HideME - прям в консоль написать, из которой запускаете скрипт (у Вас же windows?) - chcp 65001 - это должно на utf-8 сменить кодировку консоли. А вот если эта консоль запускается в какой-то ide, то уже не знаю, разве что в настройках где-то –  Mar 20 '19 at 16:25
  • Вообще, я Ваш код скопировал ничего не меняя у себя в Linux и у меня всё сработало, разве что пришлось писать Tomsk тоже латиницей, как и Михаил Муругов написал –  Mar 20 '19 at 16:28
  • да, у меня Виндоус, работаю в VS 2017, которая открывает Python-консоль.Про кодировку я не совсем понял, ведь если ввести ее в консоль, она считается вместо названия города @Anton – HideME Mar 20 '19 at 16:31
  • Я имел в виду, что какая-то консоль открыта и туда пишется что-то вроде python3 script_name.py, если же её visual studio создаёт, то, к сожалению, не знаю, как там настроить что-то, может, в каких-то свойствах есть что-то подходящее, но я с visual studio вовсе не знаком –  Mar 20 '19 at 16:33
  • @HideME Видимо, этот ответ поможет: https://ru.stackoverflow.com/a/804536/247581 –  Mar 20 '19 at 16:35

1 Answers1

1

При запросе для города Tomsk у меня выдает исключение:

UnicodeEncodeError: 'charmap' codec can't encode character '\u2212' in position 35: character maps to <undefined>

Гуглим код символа unicode 2212, находим, что это юникодный знак минус ('MINUS SIGN' (U+2212)).

Чтобы в консоли выводилось корректно, можно тупо через replace заменять на обычный минус:

print(day[0])
print('Температура сейчас: ' + temperature[0].replace('\u2212', '-'))
print('Погода: %s' % weather_type[0], end=', ')
print('%s %s' % (feels[0].lower(), feels[1].replace('\u2212', '-')))

Пример вывода:

Введите город: Tomsk
Сейчас 23:40
Температура сейчас: -4
Погода: Ясно, ощущается как -9
insolor
  • 49,104
  • 1
    можно попробовать обойтись без хаков с заменами минусов. Думаю (не тестировал), достаточно консольный шрифт использовать, в котором этот символ есть. Python 3.7 использует Unicode для отображения в Windows консоли. – jfs Mar 20 '19 at 17:25
  • @jfs, сначала подумал, что не той версией python запускаю код, но видимо проблема с редактором, из которого запускаю (SciTe-ru), потому что вывод sys.version показывает 3.6.5. Если запускать из командной строки, то все нормально, не ругается на юникодные символы. – insolor Mar 21 '19 at 16:32
  • 1
    в редакторе вывод не в консоль, а перенаправлен может быть (в этом случае используется байтовый интерфейс с кодировкой окружения, которая может не поддерживать желаемые символы, по ссылке это описано). 3.6 версия тоже должна работать. – jfs Mar 21 '19 at 16:49
  • Действительно, в перенаправлении была проблема. Убрал перенаправление - юникод заработал (не понятно зачем перенаправление было нужно, если в итоге запускается в стандартной консоли). – insolor Mar 21 '19 at 17:10