平衡点
2009/12/11
_ ADS へ検索かけて BibTeX のエントリを持ってくる
何故か Ruby::Mechanize を使って 10 分スクリプトでっちあげた.API 公開されてないのかな…ありそうなモンだけれど.
というわけで.
#!/usr/bin/env ruby require 'mechanize' require 'kconv' agent = WWW::Mechanize.new ads_search = agent.get("http://adsabs.harvard.edu/basic_search.html") search_form = ads_search.forms[0] search_form['qsearch'] = "#{ARGV.join(" ")}" redirect_page = agent.submit(search_form) results = redirect_page.forms[1].checkboxes_with(:name => 'bibcode') results_number = results.size if results_number == 0 puts "no search result retry!" elsif results_number > 1 puts "search result too many, retry!" puts "=========================" i = 0 results.each do |result| puts i.to_s + " " + result.value i += 1 end else result = agent.get(redirect_page.links[5].href) bibtex_query = result.link_with(:text => "Bibtex entry for this abstract").href bibtex = agent.get(bibtex_query).content.to_s puts bibtex.split("\n")[5..-1].join("\n") end
単にBasic Searchの form に ARGV.join(" ") を入れて, 検索結果が一つだったら BibTeX のエントリを標準出力へ, というもんです.本当はちょっとだけ対話的に, 例えば検索結果の一覧を表示して,必要なモンだけ選んで BibTeX のエントリをまとめて取得する, とかやりたかったけれど, 時間ないんで…
そのうち弄るかもしれない. とりあえず放置((あ, そういえば NAOJ って ADS のミラー止めたのかな)). 誰か弄りませんか? id:msll さんとか.
結果は以下の通り
$ ADSquery2bib.rb Busse 1970 thermal instabillity @ARTICLE{1970JFM....44..441B, author = {{Busse}, F.~H.}, title = "{Thermal instabilities in rapidly rotating systems.}", journal = {Journal of Fluid Mechanics}, year = 1970, volume = 44, pages = {441-460}, doi = {10.1017/S0022112070001921}, adsurl = {http://adsabs.harvard.edu/abs/1970JFM....44..441B}, adsnote = {Provided by the SAO/NASA Astrophysics Data System} }