0

在以下代码中:

page = Nokogiri::HTML($browser.html)
page_links = page.css("a").select
page_links.each do |link|
    if not link.nil?
        if not link['href'].nil? and !!link['href']["/about"]
            puts link.class
            puts link.inspect
        end
    end
end

link.class输出如下:

Nokogiri::XML::Element
#<Nokogiri::XML::Element:0x..fdb623d3c name="a" attributes=[#<Nokogiri::XML::Attr:0x..fdb623c7e name="action-type" value="8">, #<Nokogiri::XML::Attr:0x..fdb623c74 name="class" value="a-n g-s-n-aa g-s-n-aa I8 EjFvwd VP">, #<Nokogiri::XML::Attr:0x..fdb623c6a name="target" value="_top">, #<Nokogiri::XML::Attr:0x..fdb623c60 name="href" value="./104882190640970316938/about">] children=[#<Nokogiri::XML::Text:0x..fdb623792 "PetSmart Winchester">]>

link.inspect输出以下内容:

Nokogiri::XML::Element
#<Nokogiri::XML::Element:0x..fdb623666 name="a" attributes=[#<Nokogiri::XML::Attr:0x..fdb6235a8 name="action-type" value="8">, #<Nokogiri::XML::Attr:0x..fdb62359e name="class" value="a-n g-s-n-aa g-s-n-aa Gbb EjFvwd VP">, #<Nokogiri::XML::Attr:0x..fdb623594 name="target" value="_top">, #<Nokogiri::XML::Attr:0x..fdb62358a name="href" value="./104882190640970316938/about">] children=[#<Nokogiri::XML::Element:0x..fdb6230bc name="div" attributes=[#<Nokogiri::XML::Attr:0x..fdb62304e name="style" value="height:110px; width:110px;">] children=[#<Nokogiri::XML::Element:0x..fdb622e1e name="img" attributes=[#<Nokogiri::XML::Attr:0x..fdb622db0 name="style" value=" height: 110px; width: 110px;">, #<Nokogiri::XML::Attr:0x..fdb622da6 name="class" value="mja">, #<Nokogiri::XML::Attr:0x..fdb622d9c name="src" value="https://mts0.google.com/vt/data=TSwRVVf0DGlwBQqarpBU3wUz-i2gqbuWEbxTilWKINf30Au9l0oLM_ojk4KI0oPUi8kL5fJaJWte45O3abOXMzE3L7xDBg">]>]>]>

在 Nokogiri 中,我可以通过 访问链接文本link.content和通过link['href']. 然而,这些方法都不适用于检查结果中的图像源。

我怎样才能src在这个示例代码中获得检查所揭示的 img?

更新:这是 HTML 代码

<div class="HWb">
<div class="erb">
    <div class="ubb">
        <div role="button" class="a-f-e c-b c-b-T c-b-Oe c-b-H-ra L0a X9" tabindex="0"
        data-placeid="6817440171144926830" data-source="lo-gp" data-inline="true"
        data-tooltip-delay="600" data-tooltip-align="b,l" data-oid="104882190640970316938"
        data-size="small">
            <span class="TIa c-b-fa"></span>
        </div>
    </div>
    <h3 class="drb">
        <a href="./104882190640970316938/about" target="_top" class="a-n g-s-n-aa g-s-n-aa I8 EjFvwd VP"
        action-type="8">PetSmart Winchester</a>
    </h3>
</div>
<div class="Qbb">
    <span class="vqb SIa">Pet Store</span>
    <span class="lja SIa">
        <a href="//www.google.com/url?sa=D&amp;oi=plus&amp;q=https://maps.google.com/maps?q%3DPetsmart%2Bloc:22601%26numal%3D1%26hl%3Den-US%26gl%3DUS%26mix%3D2%26opth%3Dplatter_request:2%26ie%3DUTF8%26cid%3D6817440171144926830%26iwloc%3DA"
        target="_blank" class="a-n uqb">2310 Legge Boulevard, Winchester, VA</a>
    </span>
    <span class="SIa">(540) 662-5544</span>
</div>
<div class="crb">
    <div class="Pbb a-f-e">
        <div class="Fbb">
            <div class="cca">
                <div class="tob">
                    <div class="xob">“Do not bother with the grooming salon, the staff are unusually stupid.
                        Otherwise the store is a typical petsmart.”&lt;/div>
                </div>
            </div>
        </div>
    </div>
    <div class="dWa">
        <a href="./104882190640970316938/about" target="_top" class="a-n g-s-n-aa g-s-n-aa Gbb EjFvwd VP"
        action-type="8"><div style="height:110px; width:110px;"><img src="https://mts0.google.com/vt/data=TSwRVVf0DGlwBQqarpBU3wUz-i2gqbuWEbxTilWKINf30Au9l0oLM_ojk4KI0oPUi8kL5fJaJWte45O3abOXMzE3L7xDBg" class="mja" style=" height: 110px; width: 110px;"></div></a>
    </div>
</div>

4

3 回答 3

1

您的两个输出看起来像是两个不同的链接(即两者link.class都有link.inspect)。

假设我们正在讨论在第二个输出中获取图像源,看起来 HTML 类似于:

<a href="href"><div><img src="image_src" /></div></a>

假设这是真的,那么你需要做:

puts link.at_css("img")['src']
于 2012-08-16T02:15:31.713 回答
1

如果没有 HTML,您会变得更加困难,但是在深入研究inspect输出之后,我认为我有一个合理的 HTML 片段。

这就是我如何获取<img src="...">标签:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<a action-type="8" class="a-n g-s-n-aa g-s-n-aa Gbb EjFvwd VP" target="_top" href="./104882190640970316938/about">
    <div style="height:110px; width:110px;">
        <img style=" height: 110px; width: 110px;" class="mja" src="https://mts0.google.com/vt/data=TSwRVVf0DGlwBQqarpBU3wUz-i2gqbuWEbxTilWKINf30Au9l0oLM_ojk4KI0oPUi8kL5fJaJWte45O3abOXMzE3L7xDBg">
    </div>
</a>
EOT

doc.at('img')['src'] # => "https://mts0.google.com/vt/data=TSwRVVf0DGlwBQqarpBU3wUz-i2gqbuWEbxTilWKINf30Au9l0oLM_ojk4KI0oPUi8kL5fJaJWte45O3abOXMzE3L7xDBg"

如果这不起作用,您需要花时间改进您的问题并提供更多详细信息。


如果您不确定是否会有 0、1 或 1+ 个标记实例,请使用它,search因为它返回一个 NodeSet,它的作用类似于 Array,从而可以轻松处理无、单次或多次出现:

doc.search('img').map{ |img| img['src'] } 

将以<img src="...">数组的形式返回文档中的所有值。您可以轻松地遍历那些或使用empty?来查看是否没有命中:

doc.search('img').map{ |img| img['src'] }.each do |src|
  # do something with src if any are found.
end

如果您可能有没有参数<img>的标签,请在迭代之前将它们过滤掉:src="..."compact

doc.search('img').map{ |img| img['src'] }.compact.each do |src|
  # do something with src if any are found.
end

如果您只希望出现 0 或 1 次,请尝试:

src = doc.at('img') && doc.at('img')['src']

如:

doc = Nokogiri::HTML(<<EOT)
<html><body><p>foo</p>
<img src="blah">
<p>bar</p></body></html>
EOT
src = doc.at('img') && doc.at('img')['src']
=> "blah"

或者,没有src参数:

doc = Nokogiri::HTML(<<EOT)
<html><body><p>foo</p>
<img>
<p>bar</p></body></html>
EOT
src = doc.at('img') && doc.at('img')['src']
=> nil

或完全丢失<img>标签:

doc = Nokogiri::HTML(<<EOT)
<html><body><p>foo</p>
<p>bar</p></body></html>
EOT
src = doc.at('img') && doc.at('img')['src']
=> nil

如果要继续使用if块:

if doc.at('img')
  puts doc.at('img')['src']
end

将完成您的:

if not doc.at('img').nil?
  puts doc.at('img')['src']
end

完成,但以更直接和简洁的方式,同时保持可读性。

进行两次at查找的缺点是在大文档中成本很高,尤其是在循环中。您可以获得所有 Perlish 并使用:

if (img = doc.at('img'))
  puts img['src']
end

但这并不是真正的 Ruby 方式。为了清晰和长期维护,我可能会使用:

img = doc.at('img')
if (img)
  puts img['src']
end

但这暴露了img变量,使事情变得混乱。在这一点上,这是程序员的选择。

于 2012-08-16T04:07:34.050 回答
0

我发现如果您从 获取结果link.inspect,因为它们是一个字符串,并且使用正则表达式,您可以获取图像 URL。

link.inspect[/http.*com.*"/].chop # Since all other urls are relative ./

我不相信这是最好的方法。我将首先尝试使用其他答案。

于 2012-08-24T11:29:52.523 回答