2017-02-16 101 views
5

Używam Rails 5 z Ruby 4.2 i skanuję dokument, który analizowałem z Nokogiri, szukając w sposób niewrażliwy na wielkość liter z linkiem z tekstem:Jak uniknąć "Nieprawidłowej sekwencji bajtów", szukając linku z tekstem za pomocą Nokogiri

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

Po otrzymaniu kodu HTML mojej stronie internetowej w content, I analizować je w doc nokogiri używając:

doc = Nokogiri::HTML(content) 

problem polega na tym, dostaję

ArgumentError invalid byte sequence in UTF-8 

na niektórych stronach internetowych przy użyciu powyższego wyrażenia regularnego.

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>' 

Czy jest sposób, w jaki mogę przepisać powyższe dane, aby automatycznie zakodować kodowanie lub dziwne znaki, a nie odrzucać?

+0

Proszę przeczytać "[mcve]". Pytając o problem z kodem, musimy zobaczyć minimalny kod i minimalne dane wejściowe, które demonstrują problem. Twój pierwszy wiersz kodu jest wątpliwy i sugeruje, że kod przed nim nie jest napisany wyraźnie, ale, oczywiście, nie widząc go, nie możemy ci tam pomóc. W Internecie dziko bardzo często można znaleźć strony, które nie zostały wygenerowane poprawnie lub czysto, często zawierające znaki, które zostały wprowadzone za pomocą klawiatury na maszynach Windows, powodując wprowadzenie znaków ISO-8859-1 lub Win-1252 do tekstu. Konwertuj te przed analizą. –

Odpowiedz

4

Twoje pytanie mogło już wcześniej zostać odebrane. Czy wypróbowałeś metody z "Is there any way to clean a file of "invalid byte sequence in UTF-8" errors in Ruby?"?

szczególności przed blokiem detect, spróbuj usunąć nieprawidłowe bajty i znaki sterujące z wyjątkiem nowej linii:

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

Pamiętaj, scrub! jest Ruby 2.1+ method.

+1

Szorowanie nie jest pierwszym wyborem. Zamiast tego znaki są zwykle znakami ISO-8859-1 lub Win-1252, a konwersja ich do UTF-8 zachowa je; Metoda łańcuchowa ['encode'] (http://ruby-doc.org/core-2.4.0/String.html#method-i-encode) jest punktem wyjścia. Zobacz http://stackoverflow.com/a/17023810/128421 –