南礀中題

いろいろです。基本的にアフィリエイトが多いのでご注意を。

XML文書のタグ内テキストを連番ファイルに書き込む

目的

XML文書をパースするときに、任意のタグ(pとかdivとか)の中身を順番に抽出して、ファイルを連番で生成しながら抽出した順番にそのファイルに書き込んでいきたい。

イントロダクション

プログラミング初心者にとって一番大変なのは実はその言語の仕組みや構造をきちんと理解することではない。そもそも、あらゆる体系について同じことが言える。 初心者にとっての問題とは、調べ方がわからない ということである。

例えば、日常の作業のうちコーディングが求められるのが3割程度の人がいたとき、「rubyの変数展開ってpythonでどうやるんだっけ」と表現することはかなり難しい。実際、僕は自分の問題がここにあることに気づき、かつ、それを適切な言葉によって調べることはとても難しかった。 そこで、検索である。この記事は、なるべく目的に書いたのと同じ作業がした人のために書いた。どうか、人文系でプログラミングを必要としている人に届いて欲しいと思う。

実装

環境
osx 10.12.5, Python 3.5.2 :: Anaconda custom (x86_64)

そのドキュメントがXMLであるならば、やはりライブラリの豊富なpythonで書くのが一番手っ取り早い。pythonでどう実装するのがいいか情報科の友人に相談したところ、BeautifulSoupでやれば良い、というアドバイスをもらった。

というわけで、早速書いてみよう。

 from bs4 import BeautifulSoup
 text = open('file.xml', 'r+')
 soup = BeautifulSoup(text, 'lxml')

インポートするためにはbs4をインストールしておく必要がある。python環境をAnacondaにしておけば、こういう時に楽に用意できるので素晴らしい。 さて、1でインポートして、2でディレクトリにあるファイルを開いている。httpでもらったものをパースするのについても、bsは楽にやってくれるのでdocを詳しく読んでみると良い。3では、ファイルを読み込ませた変数をbsで処理している。

では、次に連番ファイルの生成をやってみよう。インテレータを使うとかっこいいのだが、僕は素人なのでwhileを使う。例えば、こんなのが文書の中にあるとする。

    <a href="http://example.com/elsie" class="sister" id="1">Elsie</a>,
    <a href="http://example.com/lacie" class="sister" id="2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="3">Tillie</a>;

via BeautifulSoup

これはbsの公式ドキュメントの例をほんの少し変えたものだ。では、このタグに囲まれている単語を抜き出して、連番ファイルを生成しながら書き込んでみよう。

    c = 1
    while c<=3: '''無限ループにならないようにする。'''
    find_tag = soup.find(id="%d"%c) '''id属性の番号を変数の値を入れつつ、そのid属性のタグで囲まれたところを持ってくる。'''
    input_text = find_tag.get_text() '''タグで囲まれたテキストをstringにして持ってくる。'''
    f = open('section_%d.txt'%c,'w') '''カウント毎にテキストに番号を振って生成させる。'''
    f.write(input_text)
    f.close
    c+=1 

あまりに素人臭いが、このブログは技術者どうしのコミュニティに寄与するものではなく、素人向けのものなのでまぁ良い。

find_tag = soup.find(id="%d"%c)で、とくに指定せずパスを通して抜き出してくれるというのは、bsの強みだ。

というところで話の腰を折るのだけれど、簡単な作業はだいたいrubyで統計系ではRをなんだかんだいって使っているので、pythonで変数展開(%sとか%d)をする方法を全く思い出せず笑えなかった。少し調べたら、pythonの変数展開をrubyライクにするモジュールを公開している人がいて(ググってみるとすぐ出てくる)、世界の狭さを感じた。

記事の本題に戻ると、僕の場合、idは全部で50個くらいあるテキストファイルで、ファイルサイズは380kbくらいある。100年くらい前のフランス語の本をTEIマークアップしたものだ。今回の作業によって章ごとの比較とか、単語頻度の比較とかが簡単にできるようになったのでよかった。

終わりに

以上である。最近、人文系のことを全く書いていないので何の人なのか怪しいけれど、一番面白く読んでいるのはElie Duringの哲学アンソロジー、L'Âme である。「魂なんて存在しないものを考えてどうするの?」という素朴な疑問に対して「ある事柄を思考するための概念として重要である」という答えを軸に、魂の思索の歴史をアンソロジーとしてまとめている。普通に勉強にもなるし、面白い。

また、柏木治の『スタンダールのオイコノミア』も面白く読んだ。後者は、オイコノミアというタイトルは結局のところ止した方がよかった気がするが、とにかく19世紀前半から中頃にかけての出版事情と文学研究の融合をうまく示した例だと言える。もちろんテキストクリティーク派は読解の隙を見つけるだろうが、とにかくスタンダールに対する印象がかなり変わるという点でもオススメの1冊である。

さて、このブログは一体何だったのか。