2015-10-01 2 views
-2

И я застрял в проблеме, здесь:Почему моя строка треснула?

from lxml.html import parse 
from urllib2 import urlopen 
import codecs 

parsed = parse(urlopen('http://lakgsa.org/?page_id=18')) 
doc = parsed.getroot() 
links = doc.findall('.//div/a') 
print(links[15:20]) 
lnk=links[3] 
lnk.get('href') 
print(lnk.get('href')) 
print(lnk.text_content()) 
with codecs.open('hey.json', 'wb', encoding='utf-8') as file: 
    file.write(lnk.text_content()) 

И работает над этим, мой убунту терминал и «hey.json» шоу после этого.

'[Вербовка] ë§ì'ë¤ì¤ìì'í ° 2016ë ê¸ë¡ë² ì ì ê³μì ± ëª¨ì§ ê³μê³'

Шрифт перерыв. Я знаю, что это проблема кодирования. Но что бы я ни пытался в других решениях, не удалось.

+1

Как вы читаете и печатаете * содержимое файла? Ваш код правильно выводит UTF-8, но вы читаете этот вывод UTF-8 с неправильной кодировкой, создающей [Mojibake] (https://en.wikipedia.org/wiki/Mojibake). –

+0

Я могу воспроизвести вывод, открыв файл UTF-8 как CP1256. Ваш код Python * отлично *, это то, что вы делаете с файлом после этого, что является проблемой. –

+0

Лучше всего начинать сообщение с цели, которую вы пытаетесь выполнить. «И я застрял в проблеме, вот она« является менее идеальным способом начать вопрос. мы не знаем, что должен делать следующий код. приложите усилия, чтобы привлечь нас. – dbliss

ответ

0

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

Самый быстрый способ справиться с этим - удалить encoding=utf-8 из выходного файла open().

Правильный способ справиться с этим - преобразовать входной поток в Юникод на основе определения Charset удаленного сервера. Самый простой способ сделать это - использовать python-request и его поле response.text.

from lxml.html import parse 
import requests 
import io 

url = 'http://lakgsa.org/' 
params = {'page_id': '18'} 

response = requests.get(url, params) 
parsed = parse(response.text) 
doc = parsed.getroot() 

links = doc.findall('.//div/a') 
print(links[15:20]) 
lnk=links[3] 
lnk.get('href') 
print(lnk.get('href')) 
print(lnk.text_content()) 

# io should be used instead of codecs 
# you don't need the 'b' mode 
with io.open('hey.json', 'w', encoding='utf-8') as file: 
    file.write(lnk.text_content()) 

Возможно, вы захотите рассмотреть BeautifulSoup, который имеет очень хорошую поддержку Unicode.

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