2016-04-14 3 views
6

Я изучаю красивый суп в Python.Как конвертировать текст в формате Юникод в обычный текст

Я пытаюсь разобрать простую веб-страницу со списком книг.

например

<a href="https://www.nostarch.com/carhacking">The Car Hacker’s Handbook</a> 

Я использую следующий код.

import requests, bs4 
res = requests.get('http://nostarch.com') 
res.raise_for_status() 
nSoup = bs4.BeautifulSoup(res.text,"html.parser") 
elems = nSoup.select('.product-body a') 

#elems[0] gives 
<a href="https://www.nostarch.com/carhacking">The Car Hacker\u2019s Handbook</a> 

И

#elems[0].getText() gives 
u'The Car Hacker\u2019s Handbook' 

Но я хочу правильный текст, который дается,

s = elems[0].getText() 
print s 
>>>The Car Hacker’s Handbook 

Как изменить мой код, чтобы дать «Handbook рсА Хакер» выход вместо из «u'The Car Hacker \ u2019s Handbook»?

Просьба помочь.

+3

Нет ничего плохого в том, что вы получаете. Это строка в Юникоде с фантастическим характером апострофа. – Selcuk

+0

Спасибо, @Selcuk. Но как использовать эту строку «u'The Car Hacker \ u2019s Handbook» и хранить в файле/базе данных? Будет ли он правильно сохранен? Я имею в виду, что я попробовал 'f.write (elems [0] .getText())', я получил UnicodeEncodeError. –

+0

Спасибо, @Selcuk. Я понял. Я использовал 'elems [0] .getText(). Encode ('utf-8')' для сохранения в файл или базу данных. –

ответ

3

Вы пробовали использовать метод кодирования?

elems[0].getText().encode('utf-8') 

Более подробную информацию о Юникод и питона можно найти в https://docs.python.org/2/howto/unicode.html

Кроме того, чтобы обнаружить, если ваша строка действительно UTF-8 кодируются вы можете использовать chardet и выполните следующую команду:

>>> import chardet 
>>> chardet.detect(elems[0].getText()) 
{'confidence': 0.5, 'encoding': 'utf-8'} 
+0

СПАСИБО. Я пробовал 'elems [0] .getText(). Encode ('utf-8')'. Это сработало. Терминал Python печатает его как '' The Hacker \ xe2 \ x80 \ x99s Handbook'', но если он записан в файл, содержимое файла содержит 'The Car Hacker's Handbook'. –

+0

Круто. Я отредактировал ответ только ради правильности. – mschuh

+1

@madhusudan_k Добро пожаловать в SO. Если вы считаете, что решите то, что искали по этому ответу, не забудьте принять ответ, нажав на стрелку чуть ниже подсчета голосов. – Blaszard

-2

вы можете попробовать

import unicodedata 

def normText(unicodeText): 
return unicodedata.normalize('NFKD', unicodeText).encode('ascii','ignore') 

Это CONV ert unicodetext в обычный текст, и вы можете записать в файл.

+0

Он также удаляет «апостроф», поэтому название книги становится «Справочником по автомобильным хакерам». – BlackJack

Смежные вопросы