複数のページ タイトルを解析するスクリプトを作成しています。スタック内の別の質問のおかげで、この作業ビットができました
curl = %x(curl http://odin.1.ai)
simian = curl.match(/<title>(.*)<\/title>/)[1]
puts simian
ただし、たとえばページにタイトルがない場合に同じことを試してみると
curl = %x(curl http://zales.1.ai)
タイトルがないため、nillクラスの未定義のメソッドで終了します....この場合はそうではないため、curlがnilであるかどうかを確認できません(別の行が含まれています)
タイトルが存在しない場合でもこれを機能させ、次のページに移動して確認する解決策はありますか? nokogiri と uri (Nokogiri::HTML(open("http:/.....")) を使用して他のソリューションを試したので、このコードに固執していただければ幸いですが、これは byname_meee.1 のようなサブドメインとしても機能しません。 .ai はデフォルトの open-uri では機能しないため、curl を使用するこのコードに固執できることを感謝します。
アップデート
明確にすべきいくつかの特定のケースをおそらく省略していたことに気づきました。これは、300 ~ 400 ページを解析するためのものです。最初の実行で、nokogiri、hpricot が機能しないケースが少なくとも 2 つあることに気付きましたが、より基本的な open-uri でさえ機能しません。
1) open-uri は、 http://levant_alejandro.1.aiのような _ を持つ単純なドメインで単純に失敗します。これは有効なドメインであり、curl では機能しますが、open_uri または open_uri を使用する nokogiri では機能しません。
2) http://zales.1.aiのようにページにタイトルがない場合の 2 番目のケース
3) 3 つ目は、 http: //voldemortas.1.ai/のような有効な HTML がなく、画像が含まれるページです。
4 番目のケースは、内部サーバー エラーまたはパッセンジャー/ラック エラーしかないページです。
最初の 3 つのケースは、このソリューションでソートできます (#ruby IRC チャネルの Havenwood に感謝)。
curl = %x(curl http://voldemortas.1.ai/)
begin
simian = curl.match(/<title>(.*)<\/title>/)[1]
rescue NoMethodError
simian = "" # curl was nil?
rescue ArguementError
simian = "" # not html?
end
puts simian
今、これはエレガントでも最適でもないことを認識しています。
言い換えられた質問
nokogiri またはこれらのケースを含む別の gem (タイトルがない、有効な HTML ページがない、または 404 ページさえない) で同じことを達成するためのより良い方法はありますか? 解析しているページのタイトル構造がかなり単純な場合、上記の解決策は適切ですか? 知識のために、nokogiri のような解析用の追加の gem を使用する方が良いオプションである理由を知っておくと便利です (注: gem の依存関係をできるだけ頻繁に、時間の経過とともに破損する傾向があるようにしています)。