2010-08-13 11 views
10

Ich benutze Nokogiri, um etwas HTML scrape. In einigen Vorkommnissen, bekomme ich einige seltsame Zeichen zurück, habe ich mit dem folgenden Code den ASCII-Code für diese Zeichen aufgespürt:gsub ASCII-Code Zeichen aus einer Zeichenfolge in Ruby

@parser.leads[0].phone_numbers[0].each_byte do |c| 
    puts "char=#{c}" 
    end 

Die Zeichen in Frage haben einen ASCII-Code von 194 und 160

Ich möchte diese Zeichen während des Parsings irgendwie entfernen.

Ich habe den folgenden Code versucht, aber es funktioniert nicht.

@parser.leads[0].phone_numbers[0].gsub(/160.chr/,'').gsub(/194.chr/,'') 

Kann mir jemand sagen, wie man das erreicht?

+0

Sie sollten überprüfen, ob die Kodierung einer Seite mit der Ihrer Zeichenfolgen übereinstimmt. Welche Ruby-Version verwendest du? –

+0

Ich benutze Ruby 1.8.7 – dagda1

Antwort

6

können Sie auch versuchen,

s.gsub(/\xA0|\xC2/, '') 

oder

s.delete 160.chr+194.chr 
+0

Die Löschfunktion macht den Trick. Vielen Dank!! – dagda1

+5

Das: '' 's.gsub (/ \ xA0 | \ xC2 /, '')' '' ist nicht korrekt. Du musst zuerst entkommen: '' 's.gsub (/ \\ xA0 | \\ xC2 /, '')' '' um '' 'SyntaxError zu vermeiden: (pry): 6: ungültiges Multibyte-Escape:/\ xA0 | \ xC2/'' 'Fehler und selbst wenn Sie das tun, erhalten Sie:' '' ArgumentError: ungültige Bytefolge in UTF-8'''. Versuchen Sie '' s.force_encoding ("BINARY"). Gsub (0xA0.chr, "") '' 'für die erste und ändern Sie entsprechend für die Sekunde. – Cacofonix

0

Der erste Gedanke wäre, sollten Sie gsub verwenden! anstelle von gsub

gsub gibt eine Zeichenfolge und gsub zurück! Führt die Ersetzung an Ort und Stelle durch

+0

Ich würde nicht sagen, er * sollte * mit 'gsub!'. Ohne den Kontext zu kennen, könnte es angemessener sein oder es könnte völlig unangebracht sein. – Chuck

+0

würde ich zustimmen. Ich dachte in diesem Zusammenhang, dass er ihm keine andere Variable zuordnete. Aber dein Recht sollte die falsche Formulierung sein. –

5

Ihr Problem besteht darin, dass Sie einen Methodenaufruf ausführen möchten, aber stattdessen erstellen Sie eine Regexp. Sie suchen und ersetzen Strings, die aus der Zeichenkette "160" bestehen, gefolgt von einem beliebigen Zeichen und dann der Zeichenkette "chr", und tun dasselbe, außer dass "160" durch "194" ersetzt wird.

Stattdessen tun Sie gsub(160.chr, '').

+0

Ich bekomme den folgenden Fehler, wenn ich diesen Code verwende: RegexpError: vorzeitiges Ende des regulären Ausdrucks:// – dagda1

+0

Ich denke, das liegt daran, gsub (194.chr, '') bezieht sich auf ein Nicht-ASCII-Zeichen. – dagda1

+0

@ dagda1: Welche Ruby-Version verwenden Sie? Ich verstehe diesen Fehler nicht in 1.8.7 oder 1.9.1. – Chuck

0

I "ungültiges Multibyte escape" Fehler wurde immer während der obigen Lösung versucht, aber für eine andere Situation. Google war return \ xA0, wenn die Zahl größer als 999 ist und ich es entfernen wollte. Also habe ich stattdessen return_value.gsub (/ [\ xA0]/n, "") verwendet und es funktionierte perfekt für mich.

7

Ich habe diese Frage beim Versuch gefunden, unsichtbare Zeichen auszublenden, wenn ich einen String "trimme".

s.strip nicht für mich arbeiten und ich fand, dass das unsichtbare Zeichen 194

Keines der Verfahren, die oben für mich gearbeitet, aber dann fand ich „Convert non-breaking spaces to spaces in Ruby“ Frage, die sagt die ord Zahl hatte:

Use /\u00a0/ to match non-breaking spaces: s.gsub(/\u00a0/, ' ') converts all non-breaking spaces to regular spaces

Use /[[:space:]]/ to match all whitespace, including Unicode whitespace like non-breaking spaces. This is unlike /\s/ , which matches only ASCII whitespace.

So froh, dass ich das gefunden habe! Jetzt bin ich mit:

s.gsub(/[[:space:]]/,'') 

Das ist nicht die Frage, wie man gsub bestimmten Zeichencodes nicht beantworten, aber wenn Sie nur Leerzeichen zu entfernen versuchen, scheint es ziemlich gut zu funktionieren.

+0

Dies war die einzige Antwort, die für mich funktionierte, wie von Ruby 2.1.0. Habe eine Verbesserung! 's.gsub (/^[: space:] + $ /, '')' funktionierte jedoch besser für meine Zwecke. – TheLonelyGhost

Verwandte Themen