2010-08-22 19 views
8

Estoy creando una aplicación iOS que necesita para obtener algunos datos de una página web. Mi primer pensamiento fue usar 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).¿Cuál es el mejor enfoque para analizar XML/'screen scraping' en iOS? UIWebview o NSXMLParser?

Al ver que estoy cargando una página web eché un vistazo al 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ía que el javascript se guarde 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 UIView puede bloquear el hilo principal, y los documentos dicen que el javascript tiene un límite de 10MB).

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

ACTUALIZACIÓN:

escribí un post sobre mi solución: HTML parsing/screen scraping in iOS

Respuesta

6

análisis de HTML con un analizador XML por lo general no funciona de todos modos debido a que muchos sitios tienen HTML incorrecto, que un navegador web se ocupará con, pero un analizador XML estricto como NSXMLParser fallará 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.

Cargando cosas en un UIWebView podría ser la forma más sencilla de hacerlo aquí. Tenga en cuenta que no tiene que poner el UIWebView en la pantalla. Puede crear un UIWindow por separado y agregarle el UIWebView, para que pueda realizar un renderizado completo fuera de 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ía analizarlo utilizando expresiones regulares o incluso un analizador escrito a mano. Lo he hecho muchas veces, y para datos simples, esto funciona bien.

+0

¡Buena respuesta! Creo que es importante tener en cuenta que incluso el HTML correcto será rechazado por un analizador XML estricto; solo (correctamente escrito) XHTML realmente tiene buenas posibilidades de pasar por un analizador XML, lo que realmente hace que su recomendación de UIWebView sea la mejor ruta ir. – JosephH

+0

Bueno, no olvides que el 'UIWebView' también cargará todo lo demás en la página. Imágenes, Javascript, etc. Esto podría generar MUCHO uso de memoria. Personalmente, realmente probaría una expresión regular o un analizador manuscrito primero. Si eso es demasiado difícil, entonces iría a la ruta 'UIWebView'. –

+1

Excelente punto - No había considerado la buena formación del marcado. Eso se cierra para mí. –

10

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, generalmente traigo XPathQuery.h /.m archivos documentados en esta página:

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

Entonces voy a buscar los datos usando un NSConnection y consultar los datos con algo como esto:

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

Resumen:

  1. Agregar 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. Consigue el XPathQuery.h/.m

  3. utilizar una sentencia XPath para consultar el documento html.

Cuestiones relacionadas