Čeština v Python 2.7 a Scrapy

Konzole ve Windows

V Pythonu je, v porovnání s .Net Frameworkem, podpora UTF-8 trochu jinak. Výchozí kódování v Pythonu 2.7 je totiž překvapivě ASCII, platí i pro 2.6 atd. Výchozí podporu pro UTF-8 zavádí až Python 3. Protože používám Scrapy, budu se věnovat pouze Pythonu 2.7. Scrapy Python ve verzi 3 zatím nepodporuje.

Při scrapování webových stránek obvykle nejsou problémy, protože je jejich většina už v UTF-8. O to překvapivější je, když scrapnete stránku a začnete mít problémy s kódováním kvůli implementaci v Pythonu. Na Linuxu asi tenhle problém není aktuální, já jsem na něj narazil, protože používám Windows, konkrétně Windows Web Server 2008 R2. Scrapy se ovládá pomocí Command Promptu (Příkazový řádek/konzole). Pokud nic nenastavujete, ale zobrazujete si výsledky pro kontrolu přímo do konzole, tak uvidíte kódovací kaši, např.:

u010ceskxe1 republika

UnicodeEncodeError: 'charmap' codec can't encode characters i<br></br>
n position 0-1: character maps to <undefined>```

Command Prompt totiž používá jako výchozí kódování `437` (anglická verze a znamená codepage pro USA) a `852` (česká verze, codepage pro Východní Evropu).

Kódování v Command Promptu zjistíte pomocí starého DOSového příkazu `chcp`, který zobrazí aktivní console code page number.

U konzole si ještě přenastavte font. Výchozí je Raster Fonts, změňte na Lucida Console.

[![Command Prompt Properties](http://res.cloudinary.com/marb/image/upload/v1416098724/command-prompt-properties_dtow5w.png "command-prompt-properties")](http://res.cloudinary.com/marb/image/upload/v1416098724/command-prompt-properties_dtow5w.png)

Pak už stačí jenom `chcp 1250` a přenastavíte kódování na Windows 1250. Nastavení kódování platí pouze do zavření okna. Až ho otevřete znova, musíte znovu nastavit 1250, jinak budete mít výchozí 437.

[![Windows Command Prompt chcp 1250](http://res.cloudinary.com/marb/image/upload/v1416098726/command-prompt-chcp-1250_mwt8ph.png "command-prompt-chcp-1250")](http://res.cloudinary.com/marb/image/upload/v1416098726/command-prompt-chcp-1250_mwt8ph.png)


## Scrapy

U Pythonu je protivné to, že když spustíme Scrapy, tak v okamžiku kdy máme response je obsah kódovaný v UTF-8.

(*pozor kód není správně odsazen, u Pythonu je odsazení důležité;-)*

def parse(self, response):


hxs = HtmlXPathSelector(response)


print type(response)```

print type(response) nám ukáže, že je obsah v UTF-8. Pokud hned potom obsah uložíme do souboru, pořád je UTF-8. Pokud ale použijeme for smyčku, opustíme typ HtmlResponse a začneme používat typ list. Tím se rozloučíme se správným zobrazením do konzole protože Python použije výchozí ASCII.

for item in items:<br></br>
title = item.select("hgroup/h1/a/text()").extract()```

Pokud chceme data uložit do souboru musíme použít metodu encode a kódování utf-8:  

with open("list_response.txt", "a") as file:


file.write(title[0].encode('utf-8') + 'n')```

Pro výpis do konzole také použijeme encode, tentokrát s kódováním Windows 1250:
print title[0].encode("windows-1250")