2017-02-16 13 views
5

Tôi đang sử dụng Rails 5 với Ruby 4.2 và quét tài liệu mà tôi đã phân tích cú pháp bằng Nokogiri, xem xét cách phân biệt chữ hoa chữ thường với chữ:Cách tránh "chuỗi byte không hợp lệ" khi tìm liên kết bằng văn bản bằng cách sử dụng Nokogiri

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

Sau khi nhận được mã HTML của trang web của tôi trong content, tôi phân tích nó thành một doc Nokogiri sử dụng:

doc = Nokogiri::HTML(content) 

vấn đề là, tôi nhận được

ArgumentError invalid byte sequence in UTF-8 

trên các trang web nhất định khi sử dụng cụm từ thông dụng ở trên.

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

Có cách nào tôi có thể viết lại ở trên để tự động tính toán mã hóa hoặc ký tự lạ và không lật?

+0

Vui lòng đọc "[mcve]". Khi hỏi về một vấn đề với mã, chúng ta cần xem mã tối thiểu và dữ liệu đầu vào tối thiểu để chứng minh vấn đề. Dòng mã đầu tiên của bạn là có vấn đề và ngụ ý rằng mã trước khi nó không được viết rõ ràng, nhưng, tất nhiên, không nhìn thấy nó, chúng tôi không thể giúp bạn ở đó. Trong Internet hoang dã của nó rất phổ biến để tìm các trang không được tạo ra một cách chính xác hoặc sạch sẽ, thường chứa các ký tự được nhập bằng cách sử dụng bàn phím trên Windows máy dẫn đến ISO-8859-1 hoặc Win-1252 ký tự được tiêm vào văn bản. Chuyển đổi những người trước khi phân tích cú pháp. –

Trả lời

4

Câu hỏi của bạn có thể đã được trả lời trước đó. Bạn đã thử phương pháp từ "Is there any way to clean a file of "invalid byte sequence in UTF-8" errors in Ruby?" chưa?

Cụ thể trước khi khối detect, cố gắng để loại bỏ các byte không hợp lệ và ký tự điều khiển, ngoại trừ dòng sản phẩm mới:

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

Hãy nhớ rằng, scrub! là một Ruby 2.1+ method.

+1

Chà xát không phải là lựa chọn đầu tiên. Thay vào đó, các ký tự thường là các ký tự ISO-8859-1 hoặc Win-1252 và chuyển đổi chúng thành UTF-8 sẽ giữ nguyên chúng; Phương thức ['encode'] (http://ruby-doc.org/core-2.4.0/String.html#method-i-encode) của chuỗi là điểm bắt đầu. Xem http://stackoverflow.com/a/17023810/128421 –

Các vấn đề liên quan