【问题标题】:Ruby/Nokogiri site scraping - invalid byte sequence in UTF-8 (ArgumentError)Ruby/Nokogiri 网站抓取 - UTF-8 中的无效字节序列(ArgumentError)
【发布时间】:2014-09-11 07:29:12
【问题描述】:

ruby n00b 在这里。我正在尝试从存储在 CSV 文件中的每个 URL 中抓取一个 p 标签,并将抓取的内容及其 URL 输出到一个新文件 (myResults.csv)。但是,我不断收到“UTF-8 中的无效字节序列(ArgumentError)”错误,这表明 URL 无效? (它们都是标准的'http://www.exmaple.com/page'并在我的浏览器中工作)?

在这里尝试过类似线程的 .parse 和 .encode,但没有运气。感谢阅读。

代码:

require 'csv'
require 'nokogiri'
require 'open-uri'

CSV_OPTIONS = {
  :write_headers => true,
  :headers => %w[url desc]
}

CSV.open('myResults.csv', 'wb', CSV_OPTIONS) do |csv|
  csv_doc = File.foreach('listOfURLs.xls') do |url|
    URI.parse(URI.encode(url.chomp))
    begin
    page = Nokogiri.HTML(open(url))
      page.css('.bio media-content').each do |scrape|
      desc = scrape.at_css('p').text.encode!('UTF-8', 'UTF-8', :invalid => :replace) 
      csv << [url, desc]

    end
  end
end
end

puts "scraping done!"

错误信息:

/Users/oli/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/uri/common.rb:304:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)
    from /Users/oli/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/uri/common.rb:304:in `escape'
    from /Users/oli/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/uri/common.rb:623:in `escape'
    from bbb.rb:13:in `block (2 levels) in <main>'
    from bbb.rb:11:in `foreach'
    from bbb.rb:11:in `block in <main>'
    from /Users/oli/.rvm/rubies/ruby-2.0.0-p451/lib/ruby/2.0.0/csv.rb:1266:in `open'
    from bbb.rb:10:in `<main>'

【问题讨论】:

    标签: ruby-on-rails ruby web-scraping nokogiri export-to-csv


    【解决方案1】:

    两件事:

    1. 您说 URL 存储在 CSV 文件中,但您在代码中引用了 Excel 文件 listOfURLs.xls

    2. 问题似乎是文件listOfURLs.xls 的编码,ruby 假定该文件是 UTF-8 编码的。如果文件不是 UTF-8 编码或包含无效的 UTF-8 字符,您可能会收到该错误。

      您应该仔细检查文件是否以 UTF-8 编码并且不包含任何非法字符。

      如果您必须打开非 UTF-8 编码的文件,请尝试 ISO-8859-1:

      f = File.foreach('listOfURLs.xls', {encoding: "iso-8859-1"}) do |row|
          puts row
      end
      

    Some good info about invalid byte sequences in UTF-8

    更新:

    一个例子:

    CSV.open('myResults.csv', 'wb', CSV_OPTIONS) do |csv|
        csv_doc = File.foreach('listOfURLs.xls', {encoding: "iso-8859-1"}) do |url|
            URI.parse(URI.encode(url.chomp))
            begin
            page = Nokogiri.HTML(open(url))
                page.css('.bio media-content').each do |scrape|
                desc = scrape.at_css('p').text.encode!('UTF-8', 'UTF-8', :invalid => :replace) 
                csv << [url, desc]
    
            end
        end
    end
    

    【讨论】:

    • 感谢您的回复。我会将您的建议放在代码的哪个位置? (再次:newb)
    • 在函数示例中添加了更改。但是,您必须检查文件的编码方式。例如UTF-8、ISO-8859-1 等
    【解决方案2】:

    我在这里聚会有点晚了,但这应该适用于将来遇到相同问题的任何人: csv_doc = IO.read(file).force_encoding('ISO-8859-1').encode('utf-8', 替换:nil)

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 2012-12-11
      • 2023-04-03
      • 2015-07-04
      • 2016-07-05
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      相关资源
      最近更新 更多