2015-04-05 2 views
0

Я пытаюсь сменить веб-страницу. Чтобы сохранить все символы, кроме ASCII, я написал этот код.UnicodeEncodeError: обработка специальных символов

mydata = ''.join([i if ord(i) < 128 else ' ' for i in response.text]) 

и обрабатывается далее, используя красивую библиотеку пифа на супе. Теперь это не обработка некоторых специальных символов, которые находятся на веб-странице, например [tick], [star] (здесь не отображается изображение). Любая подсказка о том, как избежать этих символов и заменить их пробелом. Сейчас у меня есть эта ошибка

UnicodeEncodeError: 'charmap' codec can't encode character '\u2713' in position 62: character maps to <undefined> 
+0

Вам не нужно обрабатывать некоторые символы специальных , Продолжайте работать со строками unicode все время. – Daniel

+0

@Daniel Когда я пишу это в файл, он показывает эту ошибку. Вот почему я задал этот вопрос. Как отформатировать его в формате, который можно записать в файл? –

+0

http://ideone.com/lwJ76U Вот эта ссылка для кода @Daniel –

ответ

0

Это всегда предпочтительнее, чтобы обрабатывать все в Unicode и конвертировать в любую конкретную кодировку только до хранения или передачи. Например,

s = u"Hi, привет, ciao"

> s 
u'Hi, \u043f\u0440\u0438\u0432\u0435\u0442, ciao' 

> s.encode('ascii', 'ignore') 
'Hi, , ciao' 

> s.encode('ascii', 'replace') 
'Hi, ??????, ciao' 

Если вам нужно конкретно заменить не-ASCII символов с пробелами, вы можете написать и зарегистрировать свой собственный обработчик ошибок преобразования см codecs.register_error().

2
fp = open("output.txt","w") 

дает открытый файл для ввода текста с использованием кодировки по умолчанию, в вашем случае это кодировка, которая не имеет характер (вероятно, CP1252), отсюда и ошибки. Откройте файл с кодировкой, которая поддерживает его, и вы будете в порядке:

fp = open('output.txt', 'w', encoding='utf-8') 

Следует также отметить, что:

print("result: "+ str(ele)) 

может потерпеть неудачу, если консоль не поддерживает Unicode, который под Windows, это вероятно не будет. Используйте print(ascii(...)), чтобы получить ASCII-безопасное представление для целей отладки.

Вероятная причина, по которой ваша попытка избавиться от символов, отличных от ASCII, заключается в том, что вы удаляете их до, анализируя HTML, а не из значений, которые вы получаете после разбора. Таким образом, литерал будет удален, но если бы использовалась ссылка на символ, например &#x2713;, она осталась бы в покое, проанализирована с помощью bs4 и закончится как .

(мне грустно, что реакция по умолчанию ошибок Unicode всегда кажется, чтобы попытаться избавиться от не-ASCII символов полностью, а не фиксируя код для обработки их правильно.)

Вы также извлекая текст довольно странным образом, используя str(), чтобы получить разметку, а затем попытаться выделить теги и удалить их. Это ненадежно - HTML не так просто разобрать, вот почему BeautifulSoup - вещь - и ненужная, потому что у вас уже есть отличный HTML-парсер, который может дать вам чистый текст в элементе (get_text()).

0

Большая часть вашего кода не требуется. запрос уже делает правильное декодирование для вас, BeautifulSoup делает извлечение текста для вас, и питон делает правильную кодировку для вас при записи в файл:

import requests 
from bs4 import BeautifulSoup 

#keyterm = input("Enter a keyword to search:") 
URL = 'https://www.google.com/search?q=jaguar&num=30' 
#NO_OF_LINKS_TO_BE_EXTRACTED = 10 
print("Requesting data from %s" % URL) 
response = requests.get(URL) 
soup = BeautifulSoup(response.text) 

#print(soup.prettify()) 
metaM = soup.findAll("span","st") 
#metaM = soup.find("div", { "class" : "f slp" }) 
with open("output.txt", "w", encoding='utf8') as fp: 
    for ele in metaM: 
     print("result: %r" % ele) 
     fp.write(ele.get_text().replace('\n', ' ') + '\n') 
Смежные вопросы