-2

我如何使用 nokogiri 通过 xpath 获取图像,但我的主要问题是,我可以有这个 div,但没有图像:

image_node = @get_doc.xpath( '//*[@id="recaptcha_image"]/img/@src').map {|a| a.value }
    #binding.pry
    if image_node != nil
      rec = Net::HTTP.get( URI.parse( "#{image_node['src']}" ) ) 
    end

但我明白了

in `[]': can't convert String into Integer (TypeError)

如何正确使用?

html的一部分:

<div id="recaptcha_widget" style="display: none">
                                            <div id="recaptcha_image">
                                            <img *****>
                                            </div>
                                            <input type="text" id="recaptcha_response_field" name="recaptcha_response_field"
                                                style="width: 295px">
4

1 回答 1

3

对于大多数 HTML 查询和许多 XML 查询,我建议使用 CSS over XPath。使用 CSS 使它非常“可见”:

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div id="recaptcha_widget" style="display: none">
    <div id="recaptcha_image">
        <img src="path_to_image.jpg">
    </div>
    <input type="text" id="recaptcha_response_field" name="recaptcha_response_field" style="width: 295px">
EOT

doc.at('#recaptcha_widget img')['src'] # => "path_to_image.jpg"

如何检查,如果我有 div,但没有图像?

你如何检查你是否没有嵌入<img>标签<div>?将您的查找分成两部分,并检查nil

require 'nokogiri'

doc = Nokogiri::HTML(<<EOT)
<div id="recaptcha_widget" style="display: none">
    <div id="recaptcha_image">
        <img src="path_to_image.jpg">
    </div>
    <div id="recaptcha_image2">
    </div>
    <input type="text" id="recaptcha_response_field" name="recaptcha_response_field" style="width: 295px">
EOT

img = doc.at('#recaptcha_widget img')
img_src = img['src'] # => "path_to_image.jpg"

如果<img>标签不存在,您将获得nil

img = doc.at('#recaptcha_widget2 img') # => nil

从那时起,您将继续检查是否img已设置:

if (img)
  # ...do something...
end

或者,使用尾随rescue捕获 nil 异常并分配nilimg_src然后对其进行测试:

img_src = doc.at('#recaptcha_widget img')['src'] rescue nil # => "path_to_image.jpg"

img_src = doc.at('#recaptcha_widget2 img')['src'] rescue nil # => nil
if (img_src)
  # do something
end
于 2013-10-19T16:38:53.220 回答