【问题标题】:How to avoid "Invalid byte sequence" when looking for link with text using Nokogiri使用 Nokogiri 查找文本链接时如何避免“无效字节序列”
【发布时间】:2017-07-06 04:24:12
【问题描述】:

我正在使用带有 Ruby 4.2 的 Rails 5 并扫描我用 Nokogiri 解析的文档,以不区分大小写的方式查找带有文本的链接:

a_elt = doc ? doc.xpath('//a').detect { |node| /link[[:space:]]+text/i === node.text } : nil 

content 中获取我网页的 HTML 后,我使用以下方法将其解析为 Nokogiri 文档:

doc = Nokogiri::HTML(content) 

问题是,我得到了

ArgumentError invalid byte sequence in UTF-8

在某些网页上使用上述正则表达式时。

2.4.0 :002 > doc.encoding
 => "UTF-8" 
2.4.0 :003 > doc.xpath('//a').detect { |node| /individual[[:space:]]+results/i === node.text }
ArgumentError: invalid byte sequence in UTF-8
    from (irb):3:in `==='
    from (irb):3:in `block in irb_binding'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/nokogiri-1.7.0/lib/nokogiri/xml/node_set.rb:187:in `block in each'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/nokogiri-1.7.0/lib/nokogiri/xml/node_set.rb:186:in `upto'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/nokogiri-1.7.0/lib/nokogiri/xml/node_set.rb:186:in `each'
    from (irb):3:in `detect'
    from (irb):3
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/console.rb:65:in `start'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/console_helper.rb:9:in `start'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:78:in `console'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
    from /Users/davea/.rvm/gems/ruby-2.4.0@global/gems/railties-5.0.1/lib/rails/commands.rb:18:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4:in `<main>' 

有没有办法我可以重写上面的内容来自动解释编码或奇怪的字符而不是翻转?

【问题讨论】:

  • 请阅读“minimal reproducible example”。当询问代码问题时,我们需要查看演示问题的最少代码和最少输入数据。您的第一行代码是有问题的,并且暗示它之前的代码写得不清晰,但是,当然,如果没有看到它,我们就无法帮助您。在互联网上,经常会发现生成不正确或不干净的页面,通常包含使用 Windows 机器上的键盘输入的字符,导致 ISO-8859-1 或 Win-1252 字符被注入到文本中。在解析之前转换它们。

标签: ruby-on-rails ruby encoding nokogiri


【解决方案1】:

您的问题之前可能已经得到解答。你试过“Is there any way to clean a file of "invalid byte sequence in UTF-8" errors in Ruby?”的方法吗?

特别是在detect块之前,尝试去除除换行之外的无效字节和控制字符:

doc.scrub!("")
doc.gsub!(/[[:cntrl:]&&[^\n\r]]/,"")

请记住,scrub!Ruby 2.1+ method

【讨论】:

  • 擦洗不是首选。相反,这些字符通常是 ISO-8859-1 或 Win-1252 字符,将它们转换为 UTF-8 将保留它们; String 的encode 方法是一个起点。见stackoverflow.com/a/17023810/128421
猜你喜欢
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2012-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2014-10-31
相关资源
最近更新 更多