2010-05-10 8 views
2

J'essaie de gratter cette page: http://www.udel.edu/dining/menus/russell.html. J'ai écrit un grattoir dans Ruby en utilisant la bibliothèque Hpricot. problèmeRuby grattoir HTML écrit en Hpricot ayant des problèmes avec HTML échappé

: page HTML est échappé et je dois afficher unescape

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

J'ai essayé d'utiliser la bibliothèque de CGI en Ruby (pas trop de succès) et la pierre précieuse HtmlEntities que j'ai trouvé par this Stack après débordement .

HtmlEntities travaux au cours des essais:

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

cède correctement

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

Cependant, quand je vais l'utiliser sur un fichier avec open-uri il ne fonctionne pas correctement:

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 

Donne de manière incorrecte des choses comme:

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

et

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

mais gère correctement M & M en cédant:

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

Suis-je le code HTML traiter incorrectement une échappée? Je ne comprends pas pourquoi cela fonctionne dans certains cas et pas dans d'autres.

Je courais ruby ​​1.8.7 (2009-06-12 patchlevel 174) [i486-linux]

Toute aide/suggestion est appréciée. Merci.

Répondre

0

HTMLEntities semble fonctionner mais vous avez un problème d'encodage. Le terminal sur lequel vous imprimez est probablement configuré pour un jeu de caractères latin et affiche des caractères sur les caractères utf-8 générés par votre script.

Dans quel environnement utilisez-vous Ruby? La raison '&' s'affiche correctement est que c'est un caractère ASCII et donc affichera la même chose dans la plupart des encodages. Le problème est que ce n'est pas censé se produire seul dans un document XML et pourrait poser des problèmes plus tard quand vous alimentez votre fichier décodé à hpricot. Je crois que la bonne façon serait d'analyser avec hpricot et ensuite passer ce que vous extrayez du document à HTMLEntity.

+0

Vous aviez parfaitement raison concernant le problème d'encodage. J'ai finalement réalisé que les problèmes surgissent quand j'ouvre le fichier dans xemacs, mais les problèmes n'apparaissent pas quand je fais simplement une commande 'more' sur le fichier et l'imprime dans le terminal. Je suppose que xemacs n'est tout simplement pas configuré pour lire le fichier UTF8, car lorsque je suis passé à gedit pour les coups de pied, les problèmes ne se posaient pas non plus. Merci! – conorgil

+0

Je n'utilise pas de xemacs mais je pense qu'une version relativement récente serait au courant d'utf-8. Pour info dans emacs la commande que j'utiliserais s'appellerait revert-buffer-with-coding-system avec le raccourci clavier 'ctrl + x r utf-8' – user336851

Questions connexes