Ruby 将nokogiri与xpath一起使用

Ruby 将nokogiri与xpath一起使用,ruby,nokogiri,Ruby,Nokogiri,如何使用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']}" ) ) e

如何使用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">

对于大多数HTML查询和许多XML查询,我建议使用CSS而不是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>
    <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"

您缺少了代码附带的HTML,这使我们能够进行测试。你浪费了我们的时间,希望我们从头开始创建HTML。一般来说,我建议对普通的东西使用CSS选择器而不是XPath,因为CSS更具可读性。例如,该搜索类似于
search(“#recaptcha\u image>img>src”)
在门口检查你的态度。我没有投你反对票。我可能会投票给你,因为你没有满足一个问题的基本要求:“关于你编写的代码问题的问题必须在问题本身中描述具体的问题,并包括重现问题的有效代码。请参阅以获取指导。”但是,在你有机会解决这个问题之前,这种情况是不会发生的。@Thetman我前一段时间添加了部分html…我前一段时间开始做一个答案,根据时间戳,“前一段时间”被定义为7分钟。有一点不清楚的是
属性是否正确。但是如何进行检查,如果我有div,但没有形象?在我的情况下,它不起作用。我添加了一个解决方案。这是一种在DOM中进行增量移动的情况,和/或在尝试获取下一个/最终信息之前测试以查看您是否拥有以前的信息。
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 = doc.at('#recaptcha_widget2 img') # => nil
if (img)
  # ...do something...
end
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