python: 偶数列だけ取り出す方法・ドイツ語はLatin-1に変換するしかないのか?
数か月ぶり、久々に趣味でプログラミングです。今日は料理中にシャドウイングするドイツ語の教材を作るために、ある教材から読み上げ用のテキストを抽出するためのツールを作りました。言語はpythonです。教材を作るだけなら手動でコピペしまくってもできますが面倒ですし、せっかくなので覚えたてのpythonの勉強も一緒にやってしまえば一石二鳥なので。
教材はこれ。単語カードです
Langenscheidt 01.01.A Der Mensch - Körper - The Human Being - The Body flashcards | Quizlet
要素を見ると.TermTextというクラスで囲まれているのでまずこれを抽出します。スクレイピングはrequestとlxmlで。
#読み込み
target_url = 'https://quizlet.com/7520653/langenscheidt-0101a-der-mensch-korper-the-human-being-the-body-flash-cards/'
target_html = requests.get(target_url).content
root = lxml.html.fromstring(target_html)
#.TermTextだけ取り出す
term = root.cssselect('.TermText')
しかし配列termにはドイツ語と英語が交互に表われてくるのでそのまま出力するとドイツ語→英語→ドイツ語→・・・の順のテキストができてしまってうっとおしい。ドイツ語の部分だけがほしいです。
pythonは配列操作が優れていてなんと term[0::2] と指定するだけで偶数の部分が取り出せます!すごい!2文字!
あとは文字列操作です。ドイツ語はなぜかutf-8のまま扱うと
der FuÃ
Nach dem Spaziergang hatte sie kalte FüÃe.
のように文字化けしやがります。やむなくLatin-1という欧文文字コードに変換して切り抜けました。UNICODEのままなんとかならんのでしょうか。
ソース全文です
#!C:\Python34\python.exe
import lxml.html
import requests
import codecs
import re
#エンコードはLatin-1で
f = codecs.open("deutsch.txt", "w", "Latin-1")
#読み込み
target_url = 'https://quizlet.com/7520653/langenscheidt-0101a-der-mensch-korper-the-human-being-the-body-flash-cards/'
target_html = requests.get(target_url).content
root = lxml.html.fromstring(target_html)
#.TermTextだけ取り出す
term = root.cssselect('.TermText')
if len(term) > 0:
#偶数行だけ処理する
for block in term[0::2]:
#改行で分割
str = block.text_content().split("\n")
#1行目はコンマかカッコまで出力
str1 = re.split("[,(]", str[0])
print(str1[0] + "\n", file=f)
#2行目は下側のダブルクォーテーションだけ変えて出力
print(str[1].replace(",,", "\"") + "\n", file=f)
f.close()
出力
der Arm
Ich habe beim Sport meinen rechten Arm verletzt.
das Auge
Meine Schwester und ich haben braune Augen.
der Bauch
Er schläft am liebsten auf dem Bauch.
das Bein
Kannst du lange auf einem Bein stehen?
das Blut
Ich mag kein Blut sehen.
die Brust
Reiben Sie Brust und Rücken mit dieser Salbe ein!
die Brust
Das Baby trinkt Milch an der Brust der Mutter.
der Finger
Sie trägt an jedem Finger einen Ring.
der Fuß
Nach dem Spaziergang hatte sie kalte Füße.
das Gesicht
Es war dunkel. Ich konnte ihr Gesicht nicht sehen.
das Haar
Bald hat er keine Haare mehr auf dem Kopf.
der Hals
Sie hat einen langen Hals.
die Hand
Sie gingen Hand in Hand spazieren.
die Haut
Seine Haut ist immer ganz rot.
das Herz
Mein Herz schlägt manchmal unregelmäßig.
das Knie
Ich habe den ganzen Tag auf den Knien am Boden gearbeitet.
der Kopf
Hatte er einen Hut auf dem Kopf?
der Körper
Sie hat einen durchtrainierten Körper.
der Mund
Bitte halte den Mund und sei still!
die Nase
Deine Nase ist rot. Hast du Schnupfen?
das Ohr
Sie hält sich die Ohren zu.
der Rücken
Er hat einen schiefen Rücken.
schwach
Nach der Krankheit fühlte sie sich noch lange schwach.
stark
Für diese Arbeit bist du nicht stark genug.
der Zahn
Meine Zähne sind alle gesund.
die Zunge
Der Arzt sagt: "Zeigen Sie mir bitte lhre Zunge!"
あとはこれを読み上げサービスに突っ込んでmp3にして終わりです。これで料理中の時間が有効に使えます。