2016-02-24 9 views
0

Я пишу программу, чтобы очистить таблицу Википедии с помощью python. Все работает отлично, за исключением некоторых символов, которые, похоже, не корректно кодируются python.Python: Проблема с кодировкой символов

Вот код:

import csv 
import requests 
from BeautifulSoup import BeautifulSoup 
import sys 

reload(sys) 
sys.setdefaultencoding("utf-8") 

url = 'https://en.wikipedia.org/wiki/List_of_airports_by_IATA_code:_A' 
response = requests.get(url) 
html = response.content 

soup = BeautifulSoup(html) 
table = soup.find('table', attrs={'class': 'wikitable sortable'}) 

list_of_rows = [] 
for row in table.findAll('tr'): 
    list_of_cells = [] 
    for cell in row.findAll('td'): 
     text = cell.text.replace(' ', '') 
     list_of_cells.append(text) 
    list_of_rows.append(list_of_cells) 

outfile = open("./scrapedata.csv", "wb") 
writer = csv.writer(outfile) 
print list_of_rows 
writer.writerows(list_of_rows) 

Например Merzbrück в настоящее время кодируется как Merzbrück. Проблема более или менее кажется скандинавами (é, è, ç, à и т. Д.). Есть ли способ избежать этого? Заранее благодарим за помощь.

ответ

1

Это, конечно, проблема с кодировкой. Вопрос где это. Мое предложение состоит в том, что вы работаете на каждом шаге и смотрите на необработанные данные, чтобы узнать, можете ли вы узнать, где именно проблема с кодировкой.

Так, например, напечатайте response.content, чтобы увидеть, являются ли символы такими же, как вы ожидаете, в объекте requests. Если да, переходите и проверяйте soup.prettify(), чтобы увидеть, выглядит ли объект BeautifulSoup в порядке, затем list_of_rows и т. Д.

Все, что было сказано, мое подозрение в том, что проблема связана с написанием на csv. csv documentation имеет пример того, как писать unicode в csv. This answer также может помочь вам в решении этой проблемы.


Для чего это стоит, я был в состоянии написать соответствующие символы CSV, используя pandas библиотеку (я использую Python 3, чтобы ваш опыт или синтаксис может быть немного отличается, так как это выглядит, как вы используете python 2):

import pandas as pd 

df = pd.DataFrame(list_of_rows) 
df.to_csv('scrapedata.csv', encoding='utf-8')