Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

UnicodeEncodeError: 'charmap' codec can't encode character

python
webdriver
Теги: #<Tag:0x00007f7b656e39c0> #<Tag:0x00007f7b656e3808>

(Геннадий Мищевский) #1

Доброго дня!
Недавно взялся за webdriver и решил парсить хабр.

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.get('http://habrahabr.ru/')

list_of_titles = driver.find_elements_by_xpath("//h1[@class='title']/a[@class='post_title']")

for title in list_of_titles:
   	print(title.text)
driver.close()

в результате ошибка:

    print(title.text)
  File "C:\Python34\lib\encodings\cp866.py", line 19, in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2014' in position 15: character maps to <undefined>

Я так понимаю, что нужно просто знать какая кодировка у хабра? Если так, то где это узнать?

Кроме того есть другая проблема. Скрипты с вебдрайвером создают темповые файлы, которые остаются в системе. Хотелось бы их за собой подчищать.

Спасибо!


(Sergei Chipiga) #2
  1. Unicode error:
    Кажется это про твою проблему https://toster.ru/q/224634

  2. Удалять файлы
    Если очень хочется то можешь заюзать shutil.rmtree чтобы удалить все дерево, или os.remove, чтобы удалять файлы по одиночке. Но кажется, что темповые файлы не нужно удалять, если они создаются в темповой директории, которую очищает операционная система после перезагрузки.


(Sergei Chipiga) #3

Кстати говоря, перед выходом из тестов лучше помимо driver.close() сделать и driver.quit() потом. Это нужно чтобы остановить запущенный сервис (в случае firefox это сам браузер, в отличие от chrome’подобных браузеров, где между браузером и pyselenium’ом стоит chromedriver. Firefox поддерживает протокол selenium’a за счет расширения, которое устанавливается внутрь Firefox и слушает команды): https://github.com/SeleniumHQ/selenium/blob/master/py/selenium/webdriver/firefox/webdriver.py#L84

Отличие close от quit в том, что close - это закрытие вкладки (в данном случае у тебя одна, поэтому и закрывается браузер) а quit - это именно завершение процесса браузера


(Sergei Chipiga) #4

вот еще из документалки https://wiki.python.org/moin/PrintFails


(rmerkushin) #5

Укажите в начале файла кодировку # -- coding: utf-8 --


(Sergei Chipiga) #6

Во-первых # -*- coding: utf-8 -*-. Во-вторых в python3 это не нужно, потому что в utf-8 уже по умолчанию. К этой проблеме utf-8 не имеет отношения.
Проблема в том, что виндовая консоль имеет кодировку cp866 и не умеет отображать символ “—”, поэтому ошибка в C:\Python34\lib\encodings\cp866.py.


(Геннадий Мищевский) #7

Спасибо за хорошее объяснение, буду знать.


(Геннадий Мищевский) #8

Не помогло. Всё та же ошибка.

# -- coding: utf-8 --
from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(30)
driver.get('http://habrahabr.ru/')

list_of_titles = driver.find_elements_by_xpath("//h1[@class='title']/a[@class='post_title']")

for title in list_of_titles:
	print(title.text.encode().decode('utf-8', 'ignore'))
driver.close()
driver.quit()

(Sergei Chipiga) #9

ага, не поможет, потому что это проблема не питона, а виндовой консоли. Лучше результат сохранять в файл как минимум, а не в консоль, или заюзать специальные генераторы отчетов типа allure


(Геннадий Мищевский) #10

Это я сделал: https://github.com/Gennadiii/habro_geeko_parser/blob/master/habro_geeko_parser.py

Мысль была в том, чтобы сохранять в файл только первую статью. При следующем заходе считывать данные файла и останавливать поиск при нахождении статьи из файла. + отфильтровывать неинтересные статьи.


(Геннадий Мищевский) #11

Вообщем, жаль, что не получилось с консолью. Всё работает для Python IDLE.