为什么 bill.xpath( "//p/font/a" )[index].text 使用 Nokogiri 返回"undefined method `text' for nil:NilClass"



我是 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 视图。

相关内容

  • 没有找到相关文章

最新更新