Ruby Hpricot搜索如何
我想做一个网页搜索,如果我有结果比我需要一个属性。 以下是网页: 我感兴趣的是,如果meta的标题具有值为“og:title”的属性,或者如果我想要内容值 如果我们查看页面的来源,它有一种药剂: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
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
与其条件不匹配。在您的示例中,元素
将不为零且为空。