2010-08-22 6 views
8

Je crée une application iOS qui a besoin d'obtenir des données d'une page Web. Mon premier était cependant d'utiliser NSXMLParser initWithContentsOfURL: et d'analyser le code HTML avec le délégué NSXMLParser. Cependant, cette approche semble être rapidement pénible (si, par exemple, le HTML changeait, je devrais réécrire le code d'analyse, ce qui pourrait être gênant). Voyant que je charge une page Web que j'ai pris, jetez un oeil à UIWebView aussi. Il semble que UIWebView peut être le chemin à parcourir. stringByEvaluatingJavaScriptFromString: semble être un moyen très pratique d'extraire les données et permettrait de stocker le javascript dans un fichier séparé qui serait facile à modifier si le code HTML changeait. Cependant, en utilisant UIWebView semble un peu hacky (vu que UIWebView est une sous-classe UIView, il peut bloquer le thread principal, et les docs disent que le javascript a une limite de 10 Mo).Quelle est la meilleure approche pour analyser XML/'scraping d'écran' dans iOS? UIWebview ou NSXMLParser?

Quelqu'un a-t-il un conseil à propos de l'analyse XML/HTML avant de rester bloqué?

MISE À JOUR:

J'ai écrit un blog sur ma solution: HTML parsing/screen scraping in iOS

Répondre

6

Parsing HTML avec un analyseur XML ne fonctionne généralement pas de toute façon parce que de nombreux sites ont HTML incorrect, qu'un navigateur Web traitera avec, mais un analyseur XML strict comme NSXMLParser échouera totalement.

Pour de nombreux langages de script, il existe d'excellentes bibliothèques de scrapbooking qui sont plus clémentes. Comme le module Beautiful Soup de Python. Malheureusement, je ne connais pas de tels modules pour Objective-C.

Charger des choses dans un UIWebView pourrait être le moyen le plus simple d'aller ici. Notez que vous n'avez pas besoin de mettre le UIWebView à l'écran. Vous pouvez créer un UIWindow distinct et y ajouter le UIWebView pour que vous puissiez effectuer un rendu hors écran complet. Il y avait une vidéo WWDC2009 à ce sujet je pense. Comme vous l'avez déjà mentionné, ce ne sera pas léger. En fonction des données que vous souhaitez et de la complexité des pages à analyser, vous pouvez également l'analyser en utilisant des expressions régulières ou même un analyseur écrit à la main. Je l'ai fait plusieurs fois, et pour des données simples, cela fonctionne bien.

+0

Bonne réponse! Je pense qu'il est important de noter que même un HTML correct sera rejeté par un analyseur XML strict - seul XHTML (correctement écrit) a de bonnes chances de passer à travers un analyseur XML, ce qui fait de votre recommandation d'UIWebView le meilleur moyen de aller. – JosephH

+0

Eh bien, n'oubliez pas que 'UIWebView' va aussi charger tout le reste sur la page. Images, Javascript, etc. Cela pourrait conduire à beaucoup d'utilisation de la mémoire. Personnellement, j'essaierais d'abord une expression régulière ou un analyseur manuscrit. Si c'est trop difficile, alors j'irais sur la route 'UIWebView'. –

+1

Excellent point - Je n'avais pas considéré la bonne forme du balisage. Cela claque pour moi. –

10

Je l'ai fait plusieurs fois. La meilleure approche que j'ai trouvée est d'utiliser libxml2 qui a un mode HTML. Ensuite, vous pouvez utiliser XPath pour interroger le document.

Travailler avec l'API libxml2 n'est pas des plus agréables. Donc, je ramène habituellement XPathQuery.h /.fichiers m documentés sur cette page:

http://cocoawithlove.com/2008/10/using-libxml2-for-parsing-and-xpath.html

Je récupérer les données à l'aide d'un NSConnection et interroger les données avec quelque chose comme ceci:

NSArray *tdNodes = PerformHTMLXPathQuery(self.receivedData, @"//td[@class='col-name']/a/span"); 

Résumé:

  1. Ajouter libxml2 à votre projet, voici quelques instructions rapides pour XCode4: http://cmar.me/2011/04/20/adding-libxml2-to-an-xcode-4-project/

  2. Obtenez le XPathQuery.h/.m

  3. Utilisez une instruction XPath pour interroger le document html.