Ich betreibe die folgenden erfolgreich:Kein Zugriff auf Nokogiri Element innerhalb des Blocks
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"
Wenn ich jedoch versuche, das obige Element in einem Block zu verwenden (wie im folgenden Code gezeigt), bekomme ich einen NoMethodError für nil: NilClass.
Ich bin verwirrt, weil ich dachte, dass die lokale Variable Link im Block das gleiche Objekt wie im obigen Code wäre.
Außerdem, wenn ich die Definition Link ändern unten an:
link = row.css ('td') [4] .class-
ich einen Hash ohne Fehler, zu sagen, den Wert Link ist Nokogiri :: XML :: Element.
Kann mir jemand erklären, warum ich ein Nokogiri :: XML :: Element-Objekt habe, aber die css-Methode nicht darauf ausführen kann. Vor allem, wenn ich es im ersten Ausschnitt ausführen kann?
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>'
Bitte lesen Sie "[mcve]". Wenn wir nach einem Problem mit Code fragen, benötigen wir die minimalen Eingabedaten (in diesem Fall HTML), die das Problem in der Frage selbst aufzeigen. Bitten Sie uns nicht, auf eine Seite zu gehen und eine ganze Seite durchzulesen, da dies unsere Antwortzeit für Sie verlangsamt und unsere Fähigkeit beeinträchtigt, anderen zu helfen. Sie sollten niemals jedes Tag mit 'css' oder' search' verketten müssen. Verwenden Sie stattdessen komplexere Selektoren, die vom Orientierungspunkt zum Orientierungspunkt zum Ziel im Markup springen. Das ist weniger fragil. Außerdem sollten Sie länger warten, bevor Sie eine Antwort auswählen. –