Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Hpricot搜索如何_Ruby_Xpath_Hpricot - Fatal编程技术网

Ruby Hpricot搜索如何

Ruby Hpricot搜索如何,ruby,xpath,hpricot,Ruby,Xpath,Hpricot,我想做一个网页搜索,如果我有结果比我需要一个属性。 以下是网页: 我感兴趣的是,如果meta的标题具有值为“og:title”的属性,或者如果我想要内容值 如果我们查看页面的来源,它有一种药剂: <meta property="og:title" content="Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]" /> 所以我想要一个og的真实结果:标题查询和一个通过社交媒体[独家]探索泰坦尼克号残骸网站的

我想做一个网页搜索,如果我有结果比我需要一个属性。 以下是网页:

我感兴趣的是,如果meta的标题具有值为“og:title”的属性,或者如果我想要内容

如果我们查看页面的来源,它有一种药剂:

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

所以我想要一个og的真实结果:标题查询和一个通过社交媒体[独家]探索泰坦尼克号残骸网站的价值,以便下一次搜索,如何正确地进行

search(“/html/head/meta[(@property='og:title'])”
不会返回我想要的内容

有什么建议吗?

使用:

/html/head/meta[@property='og:title']/@content
使用:


您的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]" 
 />
Nokogiri和Hpricot分别支持
/
%
搜索
处的简写。“搜索”返回所有匹配项的数组,“在”仅返回第一个匹配项。因此,上面的示例使用CSS获取第一个节点,显示这是正确的轨迹。我不确定如何使用CSS匹配同一标记中的两个参数,因此我将使用
属性=“og:title”
跟踪所有
标记,然后根据
内容=
参数进行筛选:

(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]">]>]

根据OP的回复,使用Nokogiri still进行更新:

>> meta = (doc % 'meta[@property="og:title"]')['content']
>> meta #=> "Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]"

您的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]" 
 />
Nokogiri和Hpricot分别支持
/
%
搜索
处的简写。“搜索”返回所有匹配项的数组,“在”仅返回第一个匹配项。因此,上面的示例使用CSS获取第一个节点,显示这是正确的轨迹。我不确定如何使用CSS匹配同一标记中的两个参数,因此我将使用
属性=“og:title”
跟踪所有
标记,然后根据
内容=
参数进行筛选:

(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]">]>]

根据OP的回复,使用Nokogiri still进行更新:

>> meta = (doc % 'meta[@property="og:title"]')['content']
>> meta #=> "Explore the Titanic Wreck Site via Social Media [EXCLUSIVE]"
谢谢你的回答。 当我发布我的问题时,我没有意识到我在搜索中有错误。那是周五晚上

正确的搜索是

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]" />
谢谢你的回答。 当我发布我的问题时,我没有意识到我在搜索中有错误。那是周五晚上

正确的搜索是

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]" />

我建议切换到。它很容易使用,就像Hpricot一样,但根据我的经验,它要稳定得多。@user529543:从文档中看,它不像Hpricot是一个标准的XPath引擎……我建议切换到。它很容易使用,就像Hpricot一样,但根据我的经验,它要稳定得多。@user529543:从文档中看,它是一个标准的XPath引擎esn看起来不像Hpricot是一个标准的XPath引擎…+1以获得正确答案。可能值得一提的是如何注册名称空间。可能想检查这个答案。当我使用Hpricot时,我什么也得不到:
>(doc%“/html/head/meta[@property='og:title']/@content”)\#=>nil
>(doc/“/html/head/meta[@property='og:title']/@content”)#=>#
@Greg:这是一个正确的XPath表达式。该页面被用作文本/html,此外,它看起来像一个过渡的XHTML(格式不好,因为有些未转义
&
),因此我假设有一些特殊的解析涉及,让我在命名空间处理方面走来走去,正如@Dimitre所指出的,HTML充满了错误,但它是真实世界HTML在野外的一个很好的例子。XPath在我看来也是正确的,但Hpricot没有返回一个值,这是我对它的争议之一。没有
/@content
Hpricot查找节点。Nokogiri查找包含或不包含
/@content
的节点,这加强了我对该节点的偏好。@Greg:从已经链接的文档来看,Hpricot似乎不是标准XPath引擎。+1获得正确答案。可能值得一提的是如何注册命名空间。可能要检查该答案。I当我使用Hpricot时,什么也得不到:
>(doc%“/html/head/meta[@property='og:title']/@content”)\(由于某些未转义,因此格式不正确。
&。),因此我假设有一些特殊的解析涉及,让我在命名空间处理方面走来走去,正如@Dimitre所指出的,HTML充满了错误,但它是真实世界HTML在野外的一个很好的例子。XPath在我看来也是正确的,但Hpricot没有返回一个值,这是我对它的争议之一。没有
/@content
Hpricot查找节点。Nokogiri查找包含或不包含
/@content
的节点,这加强了我对该节点的偏好。@Greg:从已链接的文档来看,Hpricot似乎不是标准的XPath引擎。请将更新添加到原始问题中,而不是添加为答案。谢谢。是的,流程将转到如果首字母
if
或后面的
elsif
与其条件不匹配,则
else
语句将为空。在您的示例中,
元素
不会为零。请将更新添加为答案,而不是将其附加到原始问题。谢谢。是的,流程将转到
else
语句如果首字母
if
或后面的
elsif
与其条件不匹配。在您的示例中,
元素
将不为零且为空。