2009-03-11 4 views
2

J'écris de petites applications qui analysent la source de quelques pages Web, extraient des données et les enregistrent dans un autre format. Plus précisément, certaines de mes banques ne fournissent pas de téléchargements de transactions/déclarations, mais elles fournissent un accès à ces déclarations sur leurs sites Web.Analyse d'un document XML/XHTML mais ignorant les erreurs dans C#

J'en ai fait un bien, mais un autre (HSBC UK) s'avère pénible dans le cul, puisque sa source n'est pas XHTML valide. Par exemple, il y a des espaces avant la balise <?xml?>, et il y a des endroits où == est utilisé à la place de = entre un nom d'attribut et sa valeur (par exemple <li class=="lastItem">).

Bien sûr, quand je passe ces données dans mon XmlDocument, il jette un wobbly (plus précisément une exception).

Ma question est: est-il possible d'assouplir les exigences pour l'analyse XML en C#? Je sais qu'il est préférable de régler ces problèmes à la source - c'est tout à fait mon attitude - mais il n'y a quasiment aucune chance pour HSBC de changer de site web qui fonctionne déjà dans la plupart des navigateurs juste pour moi.

Répondre

7

Jetez un coup d'œil au HTML agility pack. Il vous permet d'extraire des éléments d'une page Web non conforme à XHTML via XPath, comme s'il s'agissait d'un document XHTML bien formé.

Et pour l'amour de Kleene, n'essayez pas de regexp une page HTML avec n'importe quelle sorte de complexité!

+0

+1. Si les imbéciles de HSBC servent un fichier qui n'est pas bien formaté pour les navigateurs comme text/html, c'est un fichier HTML hérité que vous devez analyser en utilisant un analyseur HTML, et pas du tout XHTML, même si ça ressemble superficiellement . – bobince

3

Je ne crois pas que vous pouvez vous détendre l'analyse, mais vous pouvez le faire passer par quelque chose comme HTML Tidy d'abord pour laisser que gérer le désordre.

+0

J'ai donné un coup de pouce à HTML Tidy, mais le HTML est si mal formé qu'il dit qu'il ne peut pas le réparer sans que je corrige les pièces manuellement. Le fait que HSBC ait jamais employé un développeur Web capable d'écrire un site aussi terrible me dépasse. –

0

Si elles ne sont pas conformes à XHTML, vous ne pouvez pas insérer le code HTML dans un objet XMLDocument, quel que soit le niveau d'effort.

Si le volume est faible, vous pouvez utiliser WebBrowserControl pour créer un objet HtmlDocument vide, puis utiliser la méthode Write() de HtmlDocument pour placer la chaîne récupérée à partir de celle-ci.

Une autre option est mshtml.HTMLDocument, ce qui est un peu pénible à travailler avec .NET, car il est interop.

Cependant, le type le plus commun de grattage d'écran utilise Regex. Une fois que vous déterminez le motif que vous cherchez, vous pouvez gratter encore et encore.

Questions connexes