0

ruby on rails で hpricot gem を使用して、Web ページを解析し、メタタグの内容を抽出します。ただし、Web サイトの<noscrpit>タグの直後に<head>タグがある場合、例外がスローされます。

Exception: undefined method `[]' for nil:NilClass

宝石を最新バージョンに更新しようとさえしました。それでも同じです。

これは私が使用するサンプルコードです。

require 'rubygems'
require 'hpricot'
require 'open-uri'
begin
       index_page = Hpricot(open("http://sample.com"))
       puts index_page.at("/html/head/meta[@name='verification']")['content'].gsub(/\s/, "")
rescue Exception => e
       puts "Exception: #{e}"
end

hpricot に Web ページを提供する前に、noscript タグを削除することを考えていました。またはそれを行う他の方法はありますか??

私のHTMLスニペット

<html> 
<head> 
<noscript> 
<meta http-equiv="refresh" content="0; url=http://www.yoursite.com/noscripts.html"/> 
</noscript> 
<meta name="verification" content="7ff5e90iormq5niy6x98j75-o1yqwcds-c1b1pjpdxt3ngypzdg7p80d6l6xnz5v3buldmmjcd4hsoyagyh4w95-ushorff60-f2e9bzgwuzg4qarx4z8xkmefbe-0-f" /> 
</head> 
<body> 
<h1>Testing</h1> 
</body> 
</html>
4

1 に答える 1

0

Hpricot で例外を複製できません。ただし、メタ タグを見つけようとしている方法には問題があります。

サンプル コードがここの回答ボックスに収まるように HTML サンプルを短縮し、HTML をローカルに保存して、open-uri を使用して取得できるようにしました。

<html>
<頭>
<noscript>
<meta http-equiv="更新" />
</noscript>
<meta name="norton-safeweb-site-verification" />
</head>
<本体>
<h1>テスト</h1>
</body>
</html>

以下の検索結果を検討してください。

#!/usr/bin/env ルビ

「ルビジェム」が必要
「hpricot」が必要
「open-uri」が必要

doc = Hpricot(open('http://localhost:3000/test.html'))

(ドキュメント / 'メタ').サイズ # => 2
(doc / 'meta')[1] # => {emptyelem <meta name="norton-safeweb-site-verification">}

(doc % 'meta[@name]') # => {emptyelem <meta name="norton-safeweb-site-verification">}

(doc % 'meta[@name="verification"]') # => nil
(doc % 'meta[@name*="verification"]') # => {emptyelem <meta name="norton-safeweb-site-verification">}

(doc % 'meta[@name="norton-safeweb-site-verification"]') # => {emptyelem <meta name="norton-safeweb-site-verification">}

Hpricot の「/」は .search() または「すべての出現箇所を検索」を意味し、「%」は .at() または「最初の出現箇所を検索」を意味することに注意してください。目的の要素に到達するために長いパスを使用すると、必要なものが見つかる可能性が低くなります。要素またはその兄弟または親で一意のものを探します。検索時にページの前のレイアウトが考慮されるため、長いアクセサーは壊れやすくなります。ページ内の何かが変更された場合、アクセサーは無効になるため、アトミックに検索するか、可能な限り最小の要素グループで検索します。また、Hpricot のドキュメントでは CSS アクセサーの使用が推奨されているため、サンプル コードではそれらを使用しています。

「メタ」タグを検索すると、2 つのオカレンスが見つかりました。ここまでは順調ですね。2番目のものをつかむことは、あなたが望むものを手に入れる1つの方法でした.

「名前パラメーター付きのメタ」を検索すると、ターゲットが見つかりました。

「'verification' で構成される名前パラメーターを持つメタ」の検索は、存在しないため失敗します。「*=」を使用してパラメーター内を検索すると機能します。

「'norton-safeweb-site-verification' で構成される名前パラメーターを持つメタ」の検索は成功します。これは完全なパラメーター値であるためです。

Hpricot には、非常に優れた CSS セレクターのセットがあります。

http://wiki.github.com/whymirror/hpricot/supported-css-selectors

とはいえ、Hpricot よりも Nokogiri を使用することをお勧めしますHpricot は黙って失敗しましたが、Nokogiri は不正な形式の XML と HTML の解析に成功したケースを見つけました。

于 2010-04-11T01:24:28.377 に答える