2017-02-16 27 views
5

kullanarak metin ile bağlantı ararken "Geçersiz bayt sırası" nasıl engellenirim Rage 5 with Ruby 4.2 kullanıyorum ve Nokogiri ile ayrıştırdığım bir belgeyi tarayarak, metinle bağlantı için büyük/küçük harf duyarlı bir şekilde arıyorum:Nokogiri

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

content benim web sayfasının HTML aldıktan sonra, ben kullanarak bir Nokogiri doc ayrıştırmak:

doc = Nokogiri::HTML(content) 

sorun şu ki, alıyorum

Yukarıdaki normal ifadeyi kullanırken belirli web sayfalarında 210

.

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/[email protected]/gems/nokogiri-1.7.0/lib/nokogiri/xml/node_set.rb:187:in `block in each' 
    from /Users/davea/.rvm/gems/[email protected]/gems/nokogiri-1.7.0/lib/nokogiri/xml/node_set.rb:186:in `upto' 
    from /Users/davea/.rvm/gems/[email protected]/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/[email protected]/gems/railties-5.0.1/lib/rails/commands/console.rb:65:in `start' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/console_helper.rb:9:in `start' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:78:in `console' 
    from /Users/davea/.rvm/gems/[email protected]/gems/railties-5.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!' 
    from /Users/davea/.rvm/gems/[email protected]/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>' 

ben kodlama veya garip karakterler için hesap otomatik ve çıldırmak değil yukarıdaki yeniden yazabilirsiniz bir yolu var mı?

+0

Lütfen "[mcve]" bölümünü okuyun. Kodla ilgili bir sorun sorulduğunda, sorunu gösteren minimum kodu ve minimum giriş verilerini görmemiz gerekir. İlk kod satırınız sorgulanabilir ve daha önce yazılan kodun açık bir şekilde yazılmadığını ima eder, ancak, tabiki görmeden orada size yardım edemeyiz. İnternette, doğru veya temiz bir şekilde üretilmeyen sayfalar bulmak çok yaygındır; genellikle Windows makinelerinde tuş takımı kullanılarak girilen karakterleri içeren ve ISO-8859-1 veya Win-1252 karakterleri metne enjekte edilen karakterler içerir. Ayrıştırmadan önce bunları dönüştürün. –

cevap

4

Sorunuz daha önce yanıtlanmış olabilir. "Is there any way to clean a file of "invalid byte sequence in UTF-8" errors in Ruby?" den yöntemlerini denediniz mi?

Özellikle detect bloğundan önce, yeni satır hariç geçersiz bayt ve kontrol karakterleri kaldırmak için deneyin:

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

hatırla, scrub! bir Ruby 2.1+ method olduğunu.

+1

Ovma, ilk tercih değildir. Bunun yerine, karakterler genellikle ISO-8859-1 veya Win-1252 karakterleridir ve bunları UTF-8'e dönüştürür; String'in ['encode'] (http://ruby-doc.org/core-2.4.0/String.html#method-i-encode) yöntemi bir başlangıç ​​noktasıdır. Http://stackoverflow.com/a/17023810/128421 adresine bakın. –

İlgili konular