iphone ios uiwebview screen-scraping nsxmlparser

iphone - ¿Cuál es el mejor enfoque para analizar XML/''screen scraping'' en iOS? UIWebview o NSXMLParser?



screen-scraping (2)

Estoy creando una aplicación de iOS que necesita obtener algunos datos de una página web. Lo primero que NSXMLParser initWithContentsOfURL: fue utilizar NSXMLParser initWithContentsOfURL: y analizar el HTML con el delegado NSXMLParser . Sin embargo, este enfoque parece que podría volverse doloroso rápidamente (si, por ejemplo, el HTML cambiara, tendría que volver a escribir el código de análisis, lo que podría ser incómodo).

Al ver que estoy cargando una página web, eché un vistazo a UIWebView también. Parece que UIWebView puede ser el camino a seguir. stringByEvaluatingJavaScriptFromString: parece una forma muy práctica de extraer los datos y permitir que el javascript se almacene en un archivo separado que sería fácil de editar si se cambiara el HTML. Sin embargo, usar UIWebView parece un poco hacky (ya que UIWebView es una subclase de UIView puede bloquear el hilo principal, y los documentos dicen que javascript tiene un límite de 10MB).

¿Alguien tiene algún consejo con respecto al análisis de XML / HTML antes de que me atasque?

ACTUALIZAR:

Escribí una publicación de blog sobre mi solución: análisis de HTML / raspado de pantalla en iOS


El análisis de HTML con un analizador XML generalmente no funciona porque muchos sitios tienen HTML incorrecto, que un navegador web NSXMLParser , pero un analizador XML estricto como NSXMLParser fracasará por completo.

Para muchos lenguajes de scripting hay grandes bibliotecas de scraping que son más misericordiosas. Como el módulo Beautiful Soup de Python. Lamentablemente, no conozco esos módulos para Objective-C.

Cargar cosas en un UIWebView podría ser la forma más sencilla de hacerlo aquí. Tenga en cuenta que no tiene que poner UIWebView en la pantalla. Puede crear una UIWindow separada y agregarle UIWebView , para que pueda realizar una representación completa fuera de la pantalla. Hubo un video de WWDC2009 sobre esto, creo. Como ya mencionas, no será liviano.

Dependiendo de los datos que desee y la complejidad de las páginas que necesita analizar, también podrá analizarlas mediante el uso de expresiones regulares o incluso un analizador escrito a mano. Lo he hecho muchas veces, y para datos simples, esto funciona bien.


He hecho esto algunas veces. El mejor enfoque que he encontrado es usar libxml2, que tiene un modo para HTML. Entonces puede usar XPath para consultar el documento.

Trabajar con la API libxml2 no es lo más agradable. Por lo tanto, normalmente traigo los archivos XPathQuery.h / .m documentados en esta página:

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

Luego busco los datos usando una NSConnection y consulto los datos con algo como esto:

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

Resumen:

  1. Agregue libxml2 a su proyecto, aquí hay algunas instrucciones rápidas para XCode4: http://cmar.me/2011/04/20/adding-libxml2-to-an-xcode-4-project/

  2. Obtenga XPathQuery.h / .m

  3. Use una declaración XPath para consultar el documento html.