我运行中访问引入nokogiri元件成功执行以下操作:无法块
require 'nokogiri'
require 'open-uri'
own = Nokogiri::HTML(open('https://www.sec.gov/cgi-bin/own-disp?action=getowner&CIK=0001513362'))
own_table = own.css('table#transaction-report')
p own_table.css('tr').css('td')[4].css('a').attr('href').value
=> “/Archives/edgar/data/0001513362/000162828016019444/0001628280-16-019444-index.htm”
然而,当我尝试在一个块使用该元件的上方(如图下面的代码),我得到零一个NoMethodError:NilClass。
我很困惑,因为我认为,在该块中的局部变量的链接将是同一个对象在上面的代码。
此外,如果我改变链接的定义下面:
链路= row.css( 'TD')[4]的.class
我得到无差错的散列,说的值链接是Nokogiri :: XML :: Element。
谁能解释一下,为什么我有一个引入nokogiri :: XML :: Element对象,但不能在其上运行的CSS方法。特别是当我可以在第一个片段中运行它时?
require 'nokogiri'
require 'open-uri'
own = Nokogiri::HTML(open('https://www.sec.gov/cgi-bin/own-disp?action=getowner&CIK=0001513362'))
own_table = own.css('table#transaction-report')
own_table.css('tr').each do |row|
names = [:acq, :transaction_date, :execution_date, :issuer, :form, :transaction_type, :direct_or_indirect_ownership, :number_of_securities_transacted, :number_of_securities_owned, :line_number, :issuer_cik, :security_name, :url]
values = row.css('td').map(&:text)
link = row.css('td')[4].css('a').attr('href').value
values << link
hash = Hash[names.zip values]
puts hash
end
secown.rb:11:in `block in <main>': undefined method `css' for nil:NilClass (NoMethodError)
from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/nokogiri-1.6.7.2/lib/nokogiri/xml/node_set.rb:187:in `block in each'
from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/nokogiri-1.6.7.2/lib/nokogiri/xml/node_set.rb:186:in `upto'
from /Users/piperwarrior/.rvm/gems/ruby-2.2.1/gems/nokogiri-1.6.7.2/lib/nokogiri/xml/node_set.rb:186:in `each'
from secown.rb:8:in `<main>'
请阅读“[mcve]”。当询问代码问题时,我们需要最小输入数据(在这种情况下为HTML),它可以证明问题本身的问题。不要让我们去一个网站阅读整个页面,因为它会减慢我们对您的响应时间,并影响我们帮助他人的能力。您绝不应该使用'css'或'search'链接每个标签。取而代之的是使用更复杂的选择器,从地标到地标跳转到标记中的目标。这不太脆弱。另外,在选择答案之前,您应该等待更长的时间。 –