Ihre XPath hat darin einen Fehler, und ist zu restriktiv:
search("/html/head/meta[(@property='og:title']")
sollte sein:
search("/html/head/meta[@property='og:title']")
den Fehler zu beheben. Ich würde es zu vereinfachen:
search("//meta[@property='og:title']")
Auch ist es nicht ganz klar, was Sie tun möchten. Wollen Sie
<meta
property="og:title"
content="Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]"
/>
finden und den Parameter content
extrahieren? Oder möchten Sie das Tag lokalisieren, bestätigen, dass es sowohl das "og:title"
Property-Tag als auch den "Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]"
Inhalt enthält, und dann weiterverarbeiten?
Das heißt, oft ist es einfacher, CSS-Accessoren anstelle von XPath zu verwenden. Ich bevorzuge Nokogiri, das sowohl XPath- als auch CSS-Selektoren hat; Ich bin mit CSS unter:
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 und Hpricot die /
und %
Abkürzung für search
und at
bzw. unterstützen. "Suche" gibt ein Array aller Übereinstimmungen zurück und "at" gibt nur die erste Übereinstimmung zurück. Das obige Beispiel ruft den ersten Knoten mit dem CSS ab und zeigt, dass dies der richtige Track ist. Ich bin mir nicht sicher, wie CSS zu verwenden, um zwei Parameter im gleichen Tag passen, ich werde so gehen nach alle<meta>
Tags mit property="og:title"
, dann auf dem content=
Parameter basierend Filter:
(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]">]>]
An diesem Punkt Wir haben den richtigen Knoten im zurückgegebenen Array, so dass du alles extrahieren kannst, was du willst, oder in seine Kinder eintauchen und plündern und plündern kannst.Um dies zu tun Sie werden .first
oder [0]
verwenden, bei dem aktuellen Knoten für die Weiterverarbeitung zu erhalten:
(doc/'meta[property="og:title"]').select{ |n| n['content'][/titanic wreck site/i] }.first
aktualisiert basierend auf OP Antwort, mit Nokogiri noch:
>> meta = (doc % 'meta[@property="og:title"]')['content']
>> meta #=> "Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]"
benötigen würde ich empfehlen, auf Schalt [Nokogiri] (http://nokogiri.org). Es ist einfach zu bedienen, wie Hpricot, aber meiner Erfahrung nach ist es viel stabiler. –
@ user529543: Von [dieser] (http://hpricot.com/demonstrations) Dokumentation sieht es nicht wie Hpricot ist eine Standard-XPath-Engine beschweren ... –