六帖のかたすみ

DVを受けていた男性。家を脱出して二周目の人生を生きています。自閉症スペクトラム(受動型)です。http://rokujo.org/ に引っ越しました。

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にして終わりです。これで料理中の時間が有効に使えます。