読者です 読者をやめる 読者になる 読者になる

水面下の夢

競プロやイラストに興味があります.メインブログがここ.ソシャゲの話はこっち(http://ameblo.jp/0n0-yumechi/).ブログアイコンはYaQ(@8_9_00)さんから.

SourceCodeGetterFromAtCoder.py(仮称)の備忘録

興味がある方と自分だけお読みください.

requestを送ってWebから情報を取ってくる

これは公式サイトに乗っていたので,これを参考にしつつ処理.

参考:
21.6. urllib.request — URL を開くための拡張可能なライブラリ — Python 3.3.6 ドキュメント

情報のデコードを行う

次にそのデータをデコードする必要がある.そのままのデータだと文字エンコードに依存するため,処理したいエンコードPython内部でのエンコードと対応していないとエラーが発生するためである.(cp932めんどくさいんですが)
以下のサイトの手順を参考にし,解決できた.一応,取ってこれなかった場合はutf-8にした.(例外処理していないけど大丈夫だろうか?)

参考:
PY習 urllibモジュール(1)

情報の解析を行う

一行づつ読み取っていく.
あまり良くないが,状態遷移モデルっぽいものを書いて対処.

また,htmlでは"<"や"&"などの一部の文字が変換されているので,予め対処.
html上で変換される文字については以下を参考にした.

参考:
HTML-特殊文字

ソースコード

Atcoderのhtmlを読んでいくと,preタグ内でソースコードが記述されていることに気がつく.

開始

<pre class="prettyprint linenums">

終了

</pre>

であるので,この間に入っているものをリストに突っ込んで保持してやれば良い.

ファイル名

たとえば,以下のようにhtmlが記述されている.

      <th><span class="lang"><span class="lang-en">Task</span><span class="lang-ja">問題</span></span></th>
      <td><a href="/tasks/abc024_c">C - 民族大移動</a></td>

ここでは,"問題"をフラグとし,"問題"という文字列があれば,次の"/tasks/abc024_c"部分を取ってきて,abc024_cをファイル名とする.

拡張子

こんな感じで与えられる.

      <th><span class="lang"><span class="lang-en">Language</span><span class="lang-ja">言語</span></span></th>
      <td>Python3 (3.4.2)</td>

問題と同様に"言語"をフラグとして,言語名をとってきて,拡張子を決定.
実装中.将来的にはdict使って決定させるつもり.外部でなんか書いてもいいけど.


というか,昨日は完全に忘れてたけど,"問題"とか,"言語"とかが他の部分で含まれているとうまく処理が動かないかもしれない.
この辺りのパターンマッチングもまた修正したほうがいいかも.

ファイルへの保存

リストに突っ込んでおいたものを保存する.

URLの決定

コマンドライン引数 or コマンドプロンプトに入力を促す表示 + input()

コマンドライン引数の使い方は知らなかったのでググった.
Python: コマンドライン引数の取得 – sys.argv変数

あと,コマンドプロンプトに入力を促す表示をする際,改行しないで出力する方法を知らなかったので,これもググった.
Python Tips:改行なしで文字列を出力したい - Life with Python


備忘録終わり

TODO

  • 拡張子の対応
  • パターンマッチングの改良
  • 参加したコンテストのURLから自動的にソースコード持ってきたいんだけど.
  • GUIで何とかしたいんだけど.
  • そもそもChrome拡張で作りたい.