ページを取得して、タグの内容を表示するシンプルなWebスクレイパーをElixirで実装してみます。
defmodule WebScripe dodef main([]) dourl = "http://www.pythonscraping.com/pages/page1.html"response = HTTPoison.get(url)IO.puts "#{inspects response}"endend
次に、例外処理を追加します。 Elixirは例外処理としてtry-rescueなどを持ちますが、パターンマッチを使うことにします。 そのため、HTTPoison.getを使います。(get!は例外を出すため今回は使用しません)
ok/errorを返してくれるので、そのままマッチさせます。ただ、HTTPステータスエラーについてはokが返ってくるためガードを使って2xx系のみbodyを取って表示するようにします。
それ以外の場合は、ステータスコードを表示するだけにしました。
case response do{:ok, %HTTPoison.Response{status_code: cd, body: body}} when (div cd, 100) == 2 ->IO.puts body{:ok, %HTTPoison.Response{status_code: cd}} ->IO.puts "HTTP Status Code: #{cd}"{:error, %HTTPoison.Error{reason: reason}} ->IO.puts "Error: #{inspect reason}"end
HTMLパーサを追加して、h1タグを取得してみます。
Flokiのfindは、[{tag, attr, content}]を返すので、Listのheadを取って、elemでtupleから内容を取得して表示させました。
obj = Floki.find(body, "h1")IO.puts "#{elem hd(obj), 2}"
まとめたコード
defmodule WebScripe dodef main([]) dourl = "http://www.pythonscraping.com/pages/page1.html"response = HTTPoison.get(url)case response do{:ok, %HTTPoison.Response{status_code: cd, body: body}} when (div cd, 100) == 2 ->obj = Floki.find(body, "h1")IO.puts "#{elem hd(obj), 2}"{:ok, %HTTPoison.Response{status_code: cd}} ->IO.puts "HTTP Status Code: #{cd}"{:error, %HTTPoison.Error{reason: reason}} ->IO.puts "Error: #{inspect reason}"endendend
0 件のコメント:
コメントを投稿