iphone html parsing html-content-extraction

analizar HTML en el iPhone



parsing html-content-extraction (9)

¿Alguien puede recomendar una biblioteca C u Objective-C para analizar HTML? Necesita manejar código HTML desordenado que no se validará del todo.

¿Existe una biblioteca de ese tipo, o es mejor que intente usar expresiones regulares?


¿Qué hay de usar el componente Webkit, y posiblemente paquetes de terceros como jquery para tareas como estas? ¿No sería posible obtener los datos html en un componente invisible y aprovechar los selectores muy maduros de los frameworks javascript?


En caso de que alguien haya llegado aquí buscando en Google un analizador de XPath, se haya ido y haya usado TFHpple. Tenga en cuenta que TFHpple usa XPathQuery. Esto es bastante bueno, pero tiene una pérdida de memoria.

En la función * PerformXPathQuery, si los nodos son nulos, saltan antes de limpiar.

Entonces, donde ve este trozo de código: agregue las dos líneas de limpieza.

xmlNodeSetPtr nodes = xpathObj->nodesetval; if (!nodes) { NSLog(@"Nodes was nil."); /* Cleanup */ xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); return nil; }

Si está haciendo MUCHO análisis, es una filtración perversa. Ahora ... ¿cómo puedo recuperar mi noche? :-)


Es posible que desee comprobar ElementParser. Proporciona un análisis "suficiente" de HTML y XML. Las interfaces agradables hacen que caminar por documentos XML / HTML sea muy sencillo. http://touchtank.wordpress.com/



Esto probablemente dependa de cuán desordenado es el HTML y qué quiere extraer. Pero generalmente Tidy hace un buen trabajo. Está escrito en C y creo que deberías poder construirlo y vincularlo estáticamente para el iPhone. Puede instalar fácilmente la versión de línea de comando y probar los resultados primero.


La API GData Objective-C de Google vuelve a implementar NSXMLElement y otras clases relacionadas que Apple eliminó del iPhone SDK. Puede encontrarlo aquí http://code.google.com/p/gdata-objectivec-client/ . Lo he usado para tratar mensajes a través de Jabber. Por supuesto, si su HTML está mal formado (faltan etiquetas de cierre), esto podría no ser de mucha ayuda.


Parece que libxml2.2 viene en el SDK, y libxml/HTMLparser.h afirma lo siguiente:

Este módulo implementa un analizador no verificador de HTML 4.0 con API compatible con los analizadores XML. Debería ser capaz de analizar el HTML del "mundo real", incluso si está severamente roto desde el punto de vista de la especificación.

Eso suena como lo que necesito, así que probablemente voy a usar eso.


Usamos Convertigo para analizar HTML en el servidor y devolver un servicio web JSON limpio y ordenado a nuestras aplicaciones móviles


Encontré usar hpple bastante útil para analizar HTML desordenado. El proyecto Hpple es un contenedor Objective-C en la biblioteca XPathQuery para analizar HTML. Utilizándolo, puede enviar una consulta XPath y recibir el resultado.

Requisitos :

-Añadir libxml2 incluye a su proyecto

  1. Menú Proyecto-> Editar configuración del proyecto
  2. Buscar establecer "Rutas de búsqueda de encabezado"
  3. Agregue una nueva ruta de búsqueda "$ {SDKROOT} / usr / include / libxml2"
  4. Habilitar la opción recursiva

-Agregar biblioteca libxml2 a su proyecto

  1. Menú Proyecto-> Editar configuración del proyecto
  2. Buscar la configuración de "Otros indicadores del enlazador"
  3. Agregue un nuevo indicador de búsqueda "-lxml2"

-Desde hpple obtenga los siguientes archivos de código fuente y agréguelos a su proyecto:

  1. TFpple.h
  2. TFpple.m
  3. TFppleElement.h
  4. TFppleElement.m
  5. XPathQuery.h
  6. XPathQuery.m

- un paseo en el tutorial XPath de w3school para sentirse cómodo con el lenguaje XPath.

Ejemplo de código

#import "TFHpple.h" NSData *data = [[NSData alloc] initWithContentsOfFile:@"example.html"]; // Create parser xpathParser = [[TFHpple alloc] initWithHTMLData:data]; //Get all the cells of the 2nd row of the 3rd table NSArray *elements = [xpathParser searchWithXPathQuery:@"//table[3]/tr[2]/td"]; // Access the first cell TFHppleElement *element = [elements objectAtIndex:0]; // Get the text within the cell tag NSString *content = [element content]; [xpathParser release]; [data release];

Problemas conocidos

Como hpple es un contenedor de XPathQuery que es otro contenedor, esta opción probablemente no sea la más eficiente. Si el rendimiento es un problema en su proyecto, le recomiendo que codifique su propia solución ligera basada en el código de la biblioteca hpple y xpathquery.