我正在尝试使用 Nokogiri获取<img>
最接近网页第一个标签的第一个图像。<p>
我将使用结果在 Facebook 分享链接中显示文章概要。
我用来获取<p>
文章第一个标签的代码如下:
doc = Nokogiri::HTML(open(@url))
@title = doc.css('title').text
@content = doc.css('p').first
我正在尝试使用 Nokogiri获取<img>
最接近网页第一个标签的第一个图像。<p>
我将使用结果在 Facebook 分享链接中显示文章概要。
我用来获取<p>
文章第一个标签的代码如下:
doc = Nokogiri::HTML(open(@url))
@title = doc.css('title').text
@content = doc.css('p').first
<img>
在 a 中的<p>
如果您还没有/不需要该<p>
元素,则:
first_img_in_p = doc.at_css('p img')
first_img_in_p = doc.at_xpath('//p//img')
请注意,如果它是 CSS 或 XPath 表达式,您可以使用并让 Nokogiri 从字符串中找出而不是at_css
or 。at_xpath
at
<img>
里面的第一个 <p>
如果您已经拥有父节点,则可以使用以下任一方法:
first_p = doc.at('p') # Better than finding all <p> and then reducing
first_image = first_p.at_css('img')
first_image = first_p.at_xpath('.//img')
但是,有了这些答案(与前两个不同),如果第一个 p 没有图像,您将根本找不到任何图像。
<img>
在文档中找到第一个如果您真的只想要第一个<img>
(可能不在 a<p>
或 first中<p>
),那么只需执行以下操作:
first_image = doc.at('img')
如果您想要第一个图像至少<p>
在文档中某个位置出现,但不一定作为<img>
...的包装器,那么请这样说,我可以进一步编辑答案。
<img>
一个<p>
在它之前(或作为祖先)编辑:根据您在下面的评论,我认为您想要:
img = doc.at_xpath('//img[preceding::p or ancestor::p]')
<img>
这表示“在文档中查找第一个在它之前<p>
某处发生的(但不是祖先),或者作为祖先的。”<p>
以下是一些测试用例,因此您可以决定这是否是您想要的:
require 'nokogiri'
[
%Q{<r><p><img id="a"/></p></r>},
%Q{<r><img id="z"/><p></p></r>},
%Q{<r><img id="z"/><p><img id="a"/></p></r>},
%Q{<r><img id="z"/><p></p><p><img id="a"/></p></r>},
%Q{<r><p></p><p><img id="a"/></p></r>},
%Q{<r><img id="z"/><p></p><p><img id="a"/></p></r>},
%Q{<r><p></p><img id="a"/></r>},
%Q{<r><img id="z"/><p></p><img id="a"/></r>},
%Q{<r><p></p><b><c><img id="a"/></c></b></r>},
%Q{<r><q><p></p></q><b><c><img id="a"/></c></b></r>},
%Q{<r><p><img id="a"/></p><img id="z"/></r>},
%Q{<r><p><img id="a"/></p><p><img id="z"/></p></r>},
].each do |xml|
doc = Nokogiri.XML(xml)
img = doc.at_xpath('//img[preceding::p or ancestor::p]')
puts "%-50s %s" % [ xml, img||NONE ]
end
#=> <r><p><img id="a"/></p></r> <img id="a"/>
#=> <r><img id="z"/><p></p></r> NONE
#=> <r><img id="z"/><p><img id="a"/></p></r> <img id="a"/>
#=> <r><img id="z"/><p></p><p><img id="a"/></p></r> <img id="a"/>
#=> <r><p></p><p><img id="a"/></p></r> <img id="a"/>
#=> <r><img id="z"/><p></p><p><img id="a"/></p></r> <img id="a"/>
#=> <r><p></p><img id="a"/></r> <img id="a"/>
#=> <r><img id="z"/><p></p><img id="a"/></r> <img id="a"/>
#=> <r><p></p><b><c><img id="a"/></c></b></r> <img id="a"/>
#=> <r><q><p></p></q><b><c><img id="a"/></c></b></r> <img id="a"/>
#=> <r><p><img id="a"/></p><img id="z"/></r> <img id="a"/>
#=> <r><p><img id="a"/></p><p><img id="z"/></p></r> <img id="a"/>
如果你正在寻找一个 img 的兄弟姐妹。@content.parent.css('>img')