2012-10-01 2 views
3

J'utilise hxt pour analyser certains fichiers html. Il a été déplacé html à l'intérieur <textarea>. hxt donne des résultats invalides (il tombe sur un tag avec du contenu dans ce cas c'est <a>). testcase minimale (pour GHCi) estEst-il possible d'analyser par hxt <textarea> avec <a> dedans?

let doc = parseHtml "<textarea>before<a>link</a>after</textarea>" 
runX . xshow $ doc //> hasName "textarea" 

qui donne [<textarea>before</textarea><textarea/>] en conséquence.

Il semble que les balises sans contenu (par exemple, <tag/>) ne perturbent pas l'analyse.

Existe-t-il un moyen d'analyser un tel code html avec hxt?

Répondre

3

Le problème est que HandsomeSoup (qui je suppose est où votre parseHTML est de) est pointilleux sur des choses comme le fait qu'un textarea ne peut pas contenir un a en HTML valide, et tentera de « réparer » tout de telles erreurs qu'il voit.

Pouvez-vous passer à hxt-tagsoup? Il accepte toujours HTML désordre (éléments non fermées, etc.), mais pas si pointilleux sur le respect du schéma spécifique HTML, il vous permettra d'avoir un a dans un textarea:

import Text.XML.HXT.Core 
import Text.XML.HXT.TagSoup 

let content = "<textarea>before<a>link</a>after</textarea>" 
let doc = readString [ withTagSoup ] content 
runX . xshow $ doc //> hasName "textarea" 

Cette affiche les éléments suivants :

["<textarea>before<a>link</a>after</textarea>"] 

Ce que je pense est ce que vous voulez.

+0

L'autre option que j'ai regardée est html-conduit avec [dom-selector] (http://hackage.haskell.org/package/dom-selector) elle utilise du texte donc ça devrait être plus efficace mais pour mon l'efficacité de la tâche n'est pas un gros problème et l'interface flèche hxt semble un peu plus intuitive, donc je vais avec votre solution, merci – Qrilka