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 つのパラメーターを一致させる方法がわからないので、すべてのタグの後に を付けてから、パラメーターに基づいてフィルター処理します。search
at
<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]"