2014-11-09 4 views
0

Я пытаюсь написать программу python, которая поможет мне автоматически получать новости с разных сайтов. На данный момент я использую python3 с beautifulsoup4 и urllib3, чтобы получить удаленную страницу и проанализировать ее.проблемы с кодировкой в ​​python3 и urllib3

проблема возникает, когда я пытаюсь прочитать текст из этой страницы, потому что они содержат символы не ASCII, такие как À à Ео ... и так далее ...

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

мне было интересно, если кто-то из вас был в моей же ситуации ..

Вот мой код

# -*- coding: utf-8 -*- 
from bs4 import BeautifulSoup 
import urllib3 

http = urllib3.PoolManager() 
req = http.request('GET', 'http://www.....') 
page = req.data.decode('utf-8') 
soup = BeautifulSoup(page) 

elements = soup.find_all('div', class_='content') 

fp = open('results.xml', 'a') 

for element in elements: 
    link = element.find('a') 
    descr = element.find('div', class_='description') 

    v_link = u'%s' % link.get('href') 
    v_description = u'%s' % descr.text 

    xml = "<news>\n" 
    xml = xml+ " <description>"+ v_description+ "</description>\n" 
    xml = xml+ " <page_link>"+ v_link+ "</page_link>\n" 
    xml = xml+ "</news>\n" 

    fp.write(xml+ '\n') 

#END FOR LOOP 

fp.close() 
+0

У вас есть примеры URL-адресов? – declension

+0

«Проблема выходит» В чем проблема именно? Есть ли ошибка? Что это? На какой линии? – shazow

ответ

0

Просто кодировать string и записывать в файл, что-то вроде этого:

desc = 'À à é ó...and so on...'.encode('utf-8') 
with open('utf8.xml', 'a') as f: 
    f.write(desc) 

cat utf8.xml 
À à é ó...and so on... 

SO, в вашем случае, возможно, вам необходимо изменить:

fp.write(xml+ '\n') 

к этому:

fp.write(xml.encode('utf-8') + '\n') 
0

без примеров, трудно сказать. Похоже, вы декодируете текст без UTF8 (возможно, это ISO-8859-1), или что BS re -decoding его на основе метаданных документа (или догадок).

несколько несвязанных советов для этого кода:

  • Будьте осторожны написания XML с помощью простых строк. Вы должны избегать его по крайней мере (если v_description или v_link содержат >, <, & и т. Д. Вы будете создавать недопустимый XML). Еще лучше: постройте XML программно (см.: Best way to generate xml?)
  • В новом Python вы можете использовать конструкцию with, чтобы гарантировать, что ваш файл будет закрыт (автоматически).
  • Не используйте + для построения строк в Python - используйте шаблоны, например. используя string.Formatter. Это быстрее и удобочитаемо.