我是 Ruby 的新手,所以如果这是一个简单的问题,请原谅我。
我在这个代码块中收到上述错误:
bills = doc.xpath("//p[@align='left']/font[@size='2']")
@billsArray = []
bills.each_with_index do |bill, index|
title = bill.xpath("//p/font/a")[index].text
link = bill.xpath("//p/font/a")[index]['href']
@billsArray << Bill.new(title, link)
end
我想做的是循环浏览我从xpath
电话中返回的项目并显示每个项目......似乎不起作用。
如果我从标题变量中取出index
,则会出现此错误:undefined method '[]' for nil:NilClass
.根据错误中的[]
,我假设[index]
实际上并没有返回值......我设置循环的方式有问题吗?
最终目标是显示此页面上所有链接的链接和链接文本:http://billstatus.ls.state.ms.us/2016/pdf/misc/h_cal.htm
以下是该文件的完整代码:
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
class Bill
def initialize(title, link)
@title = title
@link = link
end
attr_reader :title
attr_reader :link
end
def scrape_house_calendar
# Pull in the page
require 'open-uri'
doc = Nokogiri::HTML(open("http://billstatus.ls.state.ms.us/2016/pdf/misc/h_cal.htm"))
# Narrow down what we want and build the bills array
bills = doc.xpath("//p[@align='left']/font[@size='2']")
@billsArray = []
bills.each_with_index do |bill, index|
title = bill.xpath("//p/font/a")[index].text
link = bill.xpath("//p/font/a")[index]['href']
@billsArray << Bill.new(title, link)
end
# Render the bills array
render template: 'scrape_house_calendar'
end
end
通了。
当我通过我的 bills
变量创建时,我在 xpath 中没有足够深入(我认为)......我将bills
变量更改为等于doc.xpath("//p/font/a")
并且它起作用了。
您的代码告诉您,您正在尝试对 nil 的对象调用方法。为什么它是零,你必须在时间允许的情况下进行调试。
但是,通过一些重构,您可以修复XPath并将所有节点结果压缩到数组数组中,而无需进行所有索引。例如:
require 'open-uri'
require 'nokogiri'
url = 'http://billstatus.ls.state.ms.us/2016/pdf/misc/h_cal.htm'
doc = Nokogiri::HTML(open url)
@bills =
doc.xpath("//p[@align='left']/font[@size='2']").map do |node|
node.xpath("//p/font/a/text()").map { |tnode| tnode.text.strip }.zip
node.xpath("//p/font/a/@href").map(&:to_s)
end.first
@bills.first
#=> ["H. B. No. 899:", "../../../2016/PDF/history/HB/HB0899.xml"]
然后,您可以按照自己喜欢的任何方式转换数组,然后再将其输入 Rails 视图。