ruby (1.8.7): Как избавиться от непечатных символов при соскобе? - PullRequest
1 голос
/ 10 августа 2011

Я пытаюсь разобрать HTML-страницу с Nokogiri, но у меня есть некоторые проблемы с текстом. В основном, я не могу избавиться от нежелательных символов. При разборе, когда я получаю строку, я всегда стараюсь очистить ее как можно больше. Я пытаюсь преобразовать непечатаемые символы в уникальные пробелы. Я использую этот метод без успеха после многих модификаций:

def clear_string(str)
  CGI::unescapeHTML(str).gsub(/\s+/mu," ").strip
end

Например, разместите этот фрагмент HTML (скопированный из http://www.gisa.cat/gisa/servlet/HomeLicitation?licitationID=1061525)

<tr>
    <td><span class="linkred2">Tramitaci&oacute;:</span></td>
    <td>&nbsp;ordinària </td>
</tr>

Некоторые промежуточные примеры выходных данных, показанные Netbeans 7.0 с использованием Nokogiri и clear_string (метод, определенный выше)

row.at("td[1]").text # => "Tramitació:"
row.at("td[2]").text # => " ordinària "
clear_string(row.at("td[2]").text) # => " ordinària"
row.at("td[2]").text.scan(/./mu) # => ["\302\240", "o", "r", "d", "i", "n", "\303\240", "r", "i", "a", " "]

Я не знаю, почему strip не избавляется от первых пробелов. Более того, результат анализа после применения clear_string выводится в файл yaml с использованием YAML::dump. Его содержание соответственно для обоих текстов:

"Tramitaci\xC3\xB3:"
!binary |
  wqBvcmRpbsOgcmlh

Первый, похоже, не в порядке, но я не знаю, как исправить второй случай.

1 Ответ

1 голос
/ 10 августа 2011

Один из способов перевода символов из одного набора символов в другой - использовать Iconv.Например, если вам нужно просто преобразовать UTF8 в ASCII, вы можете сделать что-то вроде этого:

require 'iconv'

s = "ordinària"
Iconv.conv('ASCII//TRANSLIT', 'UTF8', s)
=> "ordinaria"

Переключатель TRANSLIT указывает Iconv попытаться транслитерировать (приблизительно совпадают) необратимые символы.Если вместо этого вы хотите полностью игнорировать необратимые символы, вы можете использовать переключатель IGNORE:

Iconv.conv('ASCII//IGNORE', 'UTF8', s)
=> "ordinria"

Обратите внимание, что Iconv сгенерирует исключение с TRANSLIT, если найдет что-то, что не может преобразовать,Для этого вы можете объединить IGNORE и TRANSLIT так:

Iconv.conv('ASCII//TRANSLIT//IGNORE', 'UTF8', s)
=> "ordinaria"
...