Как правильно обращаться с неразрывными пробелами, используя Nokogiri? - PullRequest
2 голосов
/ 11 мая 2011

Я использую Nokogiri для разбора HTML-страницы, но у меня странные проблемы с неразрывными пробелами. Я пробовал разные кодировки, заменяя пробелы и несколько других попыток вызвать головную боль.

Вот фрагмент HTML-кода, о котором идет речь:

<td>Amount 15,300&nbsp;at&nbsp;dollars</td>

Обратите внимание на изменение для &nbsp; представления после того, как я использую Nokogiri:

<td>Amount 15,300&#xa0;at&#xa0;dollars</td>

И вывод inner_text:

Amount 15,300 at dollars

Это мой базовый захват Нокогири, я попытался найти несколько альтернатив, но с треском провалился:

doc = Nokogiri::HTML(open(url))

А затем я делаю doc.search для рассматриваемого предмета.

Обратите внимание, что если я посмотрю на документ, появится строка с &#xa0; на этой строке.

Разъяснение: я не думаю, что я четко изложил трудности, с которыми я сталкиваюсь. Я не могу заставить inner_text появляться без странного символа Â.

Ответы [ 3 ]

2 голосов
/ 21 апреля 2013

Я знаю, что это старо, но мне потребовался час, чтобы выяснить, как решить эту проблему, и это действительно легко, когда вы знаете. Просто передайте вашу строку этой функции, и она будет "de-nbsp-fied".

def strip_html(str)
  nbsp = Nokogiri::HTML("&nbsp;").text
  str.gsub(nbsp,'')
end

Вы также можете заменить его пробелом, если хотите. Пусть многие из вас найдут этот ответ!

1 голос
/ 11 мая 2011

Если вы действительно, действительно не хотите сохранить нотацию &nbsp;, здесь не должно быть проблем.

A0 - шестнадцатеричный код символа для неразрывного пробела. Таким образом, &#xa0; печатает неразрывный пробел и в точности эквивалентен &nbsp;. &#160; тоже делает то же самое.

То, что здесь делает Нокогири, - это чтение текстового узла, распознавание сущностей и внутреннее преобразование их в их фактическое строковое представление. Затем, при преобразовании его обратно в HTML-дружественную версию текстового узла, он представляет неразрывный пробел в своем шестнадцатеричном коде, а не снижает производительность при поиске его в таблице сущностей, поскольку в любом случае он эквивалентен.

Предполагая, что Â было тем, что вы видели, а не просто проблемой, вставленной в StackOverflow, это проблема кодирования текста: программа вывода (браузер?) Не находится в режиме UTF-8, поэтому не ' не знает, как обрабатывать код символа A0, поэтому делает все возможное. Если это браузер, то добавление <meta charset="utf-8"> к заголовку решит эту проблему и сделает остальную часть вывода более удобной для Unicode.

Если вы действительно, действительно хотите &nbsp;, используйте gsub, чтобы заменить их в окончательном выводе. В противном случае, не беспокойтесь об этом.

0 голосов
/ 21 апреля 2013

Как говорит @sawa, главная проблема в том, что вы видите при записи в консоль. Это не правильно отображает неразрывный пробел после того, как Nokogiri преобразовывает его в соответствующее двоичное значение.

Обычный способ решения проблемы - предварительная обработка содержимого:

require 'nokogiri'

html = '<td>Amount 15,300&nbsp;at&nbsp;dollars</td>'
doc = Nokogiri::HTML::DocumentFragment.parse(html.gsub(/&(?:#xa0|#160|nbsp);/i, ' '))
puts doc.to_html

Какие выходы:

<td>Amount 15,300 at dollars</td>
...