指定したAtCoderコンテストの解説リンクを取得する
#Rust #AtCoder
まとめ
指定したAtCoderコンテストの解説リンクを出力する方法を調べた
成果物としてac-editorialというプログラムを作成した
あらまし
指定したAtCoderコンテストの解説リンクを取得したい
Rustに慣れるため、Rustでプログラムを作成する
方針
解説ページ(e.g. ) のHTMLを解析し、解説リンクを取得する
HTTPリクエスト
reqwestを使用
日本語環境でないと、Youtubeの解説URLがHTMLのノードとして追加されないことに注意する
code:rust
let client = reqwest::ClientBuilder::new().gzip(true).build().unwrap();
let doc = client
.get("https://atcoder.jp/contests/abc174/editorial") // TODO: specify contest_id
.header("Accept-Language", "ja")
.send()
.await?
.text()
.await?;
HTMLの解析
easy-scraperを使用
ここでは、仮の実装として全体の解説だけを取得してみる
PDFとYoutubeの片方しか解説が存在しないこともある(e.g. )
code:rust
let pat = Pattern::new(
r#"
<h3>コンテスト全体の解説</h3>
<ul>
<li><a href="{{url}}">公式解説</a></li>
</ul>
"#,
)?;
let result = pat.matches(&doc);
for r in result {
println!("{}", r"url");
}
コマンドライン引数
ac-editorial <contest_id>
clapを使用
code:rust
let matches = App::new("ac-editorial")
.arg(
Arg::new("contest_id")
.value_name("contest_id")
.required(true),
)
.get_matches();
let contest_id = matches.value_of("contest_id").unwrap();
ソースコード全文