Votre XPath a une erreur en elle, plus est trop restrictive:
search("/html/head/meta[(@property='og:title']")
devrait être:
search("/html/head/meta[@property='og:title']")
pour corriger l'erreur. Je le simplifierais à:
search("//meta[@property='og:title']")
En outre, ce n'est pas très clair ce que vous voulez faire. Voulez-vous trouver
<meta
property="og:title"
content="Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]"
/>
et extraire le paramètre content
? Ou voulez-vous localiser le tag, confirmez qu'il contient à la fois le tag de propriété "og:title"
et le contenu "Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]"
, puis effectuez un traitement ultérieur? Cela dit, il est souvent plus simple d'utiliser des accesseurs CSS au lieu de XPath. Je préfère utiliser Nokogiri, qui a deux sélecteurs XPath et CSS; J'utilise CSS ci-dessous:
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 et hpricot soutenir la /
et %
un raccourci pour search
et at
respectivement. "Rechercher" renvoie un tableau de toutes les correspondances, et "at" renvoie uniquement la première correspondance. Ainsi, l'exemple ci-dessus obtient le premier noeud en utilisant le CSS, montrant que c'est la bonne piste. Je ne sais pas comment utiliser CSS pour correspondre à deux paramètres dans la même balise, donc je vais aller après tous<meta>
tags avec property="og:title"
, puis filtre basé sur le paramètre 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]">]>]
À ce moment-là nous avons le bon nœud dans le tableau retourné, ainsi vous pouvez extraire tout ce que vous voulez, ou plonger dans ses enfants et saccager et piller.Pour ce faire, vous aurez envie d'utiliser .first
ou [0]
pour obtenir au niveau du noeud réel pour un traitement ultérieur:
(doc/'meta[property="og:title"]').select{ |n| n['content'][/titanic wreck site/i] }.first
mise à jour basée sur la réponse de l'OP, en utilisant Nokogiri encore:
>> meta = (doc % 'meta[@property="og:title"]')['content']
>> meta #=> "Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]"
Je vous recommande de passer à [Nokogiri] (http://nokogiri.org). C'est facile à utiliser, comme Hpricot, mais d'après mon expérience, c'est beaucoup plus stable. –
@ user529543: De la documentation de [this] (http://hpricot.com/demonstrations), il ne semble pas que Hpricot soit un moteur XPath standar plaintif ... –