0

I would like to do a search in a webpage if I have result than I need a property. Here is the webpage: link text

I am interested if, the header the meta has the property with value "og:title" ot nor, if has I want the content value

If we look at the source of the page, it has a potion of:

<meta
property="og:title" content="Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]" />

so I want a true result for og:title query and a Explore the Titanic Wreck Site via Social Media [EXCLUSIVE] value for next search, how to do it properly

search("/html/head/meta[(@property='og:title']") doesn't return what I want.

any suggestion?

4

3 に答える 3

2

使用する:

/html/head/meta[@property='og:title']/@content
于 2010-12-03T16:43:08.000 に答える
1

XPath にエラーがあり、制限が厳しすぎる:

search("/html/head/meta[(@property='og:title']")

次のようにする必要があります。

search("/html/head/meta[@property='og:title']")

エラーを修正します。私はそれを次のように単純化します:

search("//meta[@property='og:title']")

また、やりたいことがはっきりしない。見つけたいですか

<meta 
  property="og:title" 
  content="Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]" 
 />

パラメータを抽出しcontentますか?"og:title"または、タグを見つけて、プロパティ タグとコンテンツの両方が含まれていることを確認してから、"Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]"さらに処理しますか?

そうは言っても、多くの場合、XPath の代わりに CSS アクセサーを使用する方が簡単です。私は、XPath セレクターと CSS セレクターの両方を備えた Nokogiri を使用することを好みます。以下のCSSを使用しています。

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('http://mashable.com/2010/08/06/expedition-titanic'))
(doc % 'meta[property="og:title"]')
=> #<Nokogiri::XML::Element:0x8084ee48 name="meta" attributes=[#<Nokogiri::XML::Attr:0x8084ed58 name="property" value="og:title">, #<Nokogiri::XML::Attr:0x8084ed1c name="content" value="Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]">]>

Nokogiri と Hpricotは、それぞれ/andの%短縮形and をサポートしています。「検索」はすべての一致の配列を返し、「at」は最初の一致のみを返します。したがって、上記の例では、CSS を使用して最初のノードを取得しており、これが正しいトラックであることを示しています。CSS を使用して同じタグ内の 2 つのパラメーターを一致させる方法がわからないので、すべてのタグの後に を付けてから、パラメーターに基づいてフィルター処理します。searchat <meta>property="og:title"content=

(doc / 'meta[property="og:title"]').select{ |n| n['content'][/titanic wreck site/i] }
=> [#<Nokogiri::XML::Element:0x8084ee48 name="meta" attributes=[#<Nokogiri::XML::Attr:0x8084ed58 name="property" value="og:title">, #<Nokogiri::XML::Attr:0x8084ed1c name="content" value="Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]">]>]

その時点で、返された配列に適切なノードがあるので、必要なものを抽出するか、その子に飛び込んで袋に入れ、略奪することができます。これを行うには、さらに処理するために実際のノードを使用.firstまたは取得します。[0]

(doc / 'meta[property="og:title"]').select{ |n| n['content'][/titanic wreck site/i] }.first

Nokogiri を使用して、OP の応答に基づいて更新します。

>> meta = (doc % 'meta[@property="og:title"]')['content']
>> meta #=> "Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]"
于 2010-12-03T18:58:14.370 に答える
1

回答ありがとうございます。質問を投稿したとき、検索に間違いがあることに気づきませんでした。金曜日の夕方でした...

正しい検索は

elements = @doc.search("/html/head/meta[@property='og:title']")
  • (@property の前の式から文字が削除されます

これにより、次が得られます。

elements = <meta property="og:title" content="Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]" />

結果。何かを持っているかどうかを確認しているよりも、持っている場合は、コンテンツの値が必要であるよりも

if elements.nil?
   puts 'not found'
  elsif elements.size > 0
    puts "Found one, og:title = #{elements}" 
    content = elements.attr("content");
    puts content # this will display the content ( it will be processed)
  else
    ... can come here the flow control? - theoretically yes, but in practice?
  end
于 2010-12-06T08:01:15.357 に答える