У парсера Ruby HTML, написанного на Hpricot, возникают проблемы с экранированным HTML

Я пытаюсь очистить эту страницу: http://www.udel.edu/dining/menus/russell.html. Я написал парсер на Ruby, используя библиотеку Hpricot.

проблема: HTML-страница экранирована, и мне нужно отобразить ее без экранирования

example: "M&M" should be "M&M"  
example: "Entrée" should be "Vegetarian Entrée"  

Я пытался использовать библиотеку CGI в Ruby (не слишком успешно) и гем HTMLEntities, который я нашел через этот пост о переполнении стека.

HTMLEntities работает во время тестирования:

require 'rubygems' 
require 'htmlentities'
require 'cgi'

h = HTMLEntities.new
puts "h.decode('Entrée') = #{h.decode("Entrée")}"

blank = " "
puts "h.decode blank = #{h.decode blank}"
puts "CGI.unescapeHTML blank = |#{CGI.unescapeHTML blank}|"

puts "h.decode '<th width=86 height=59 scope=row>Vegetarian Entr&eacute;e</th> ' = |#{h.decode '<th width=86 height=59 scope=row>Vegetarian Entr&eacute;e</th> '}|"  

правильно дает

h.decode('Entr&eacute;e') = Entrée
h.decode blank =  
CGI.unescapeHTML blank = |&nbsp;|
h.decode '<th width=86 height=59 scope=row>Vegetarian Entr&eacute;e</th> ' = |<th width=86 height=59 scope=row>Vegetarian Entrée</th> |

Однако, когда я иду использовать его в файле с open-uri, он не работает должным образом:

require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'htmlentities'
require 'cgi'
f = open("http://www.udel.edu/dining/menus/russell.html")
htmlentity = HTMLEntities.new
while line = f.gets
  puts htmlentity.decode line
end

Неправильно выдает такие вещи, как:

<th width="60" height="59" scope="row">Vegetarian Entrée</th>

и

<th scope="row"> </th>  // note: was originally '&nbsp;' to indicate a blank

но правильно обрабатывает M&M, уступая:

<td valign="middle" class="menulineA">M&M Brownies</td>

Я неправильно обрабатываю экранированный HTML? Я не понимаю, почему в одних случаях это работает, а в других нет.

Я использую ruby ​​​​1.8.7 (уровень исправления 174 12 июня 2009 г.) [i486-linux]

Любая помощь/предложение приветствуется. Спасибо.


person conorgil    schedule 10.05.2010    source источник


Ответы (1)


HTMLEntities вроде работает, но у вас проблема с кодировкой. Терминал, на котором вы печатаете, вероятно, настроен на латинскую кодировку и не отвечает на символы utf-8, выводимые вашим скриптом.

В какой среде вы используете ruby?

Причина, по которой «&» отображается правильно, заключается в том, что это символ ascii, и поэтому он будет отображаться одинаково в большинстве кодировок. Проблема в том, что это не должно происходить отдельно в документе xml и может вызвать проблемы позже, когда вы загружаете свой декодированный файл в hpricot. . Я считаю, что правильным способом было бы проанализировать с помощью hpricot, а затем передать то, что вы извлекаете из документа, в HTMLEntity.

person user336851    schedule 11.05.2010
comment
Вы были совершенно правы насчет проблемы с кодировкой. Наконец-то я понял, что проблемы возникают, когда я открываю файл в xemacs, но проблемы не появляются, когда я просто выполняю команду «больше» для файла и печатаю его в терминале. Я предполагаю, что xemacs просто не настроен на чтение файла UTF8, потому что, когда я переключился на gedit для пинков, проблем также не возникло. Спасибо! - person conorgil; 12.05.2010
comment
Я не использую xemacs, но я думаю, что достаточно свежая версия будет знать об utf-8. Для информации в emacs команда, которую я бы использовал, будет называться revert-buffer-with-coding-system с сочетанием клавиш «ctrl+x ‹return›r utf-8» - person user336851; 12.05.2010