Pregunta

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

¿Existe una biblioteca de este tipo, o es mejor que solo trate de usar expresiones regulares?

¿Fue útil?

Solución 2

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

  

Este módulo implementa un analizador HTML 4.0 no verificador con API compatible con los analizadores XML. Debería poder analizar el "mundo real" HTML, incluso si se rompe gravemente desde el punto de vista de la especificación.

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

Otros consejos

El uso de hpple es 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 :

-Agregar libxml2 incluye a su proyecto

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

-Agregue la biblioteca libxml2 a su proyecto

  1. Menú Proyecto- > Editar configuración del proyecto
  2. Busque la configuración de " Otras banderas de vinculador "
  3. Agregar una nueva marca 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

- Dé un paseo por w3school XPath Tutorial 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 sobre 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 codificar su propia solución ligera basada en el código de la biblioteca hpple y xpathquery.

En caso de que alguien haya llegado a Google buscando un buen analizador XPath y se haya apagado 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 se descubre que los nodos son nulos, salta antes de limpiar.

Entonces, donde ve este fragmento 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 feroz. Ahora ... ¿cómo recupero mi noche :-)

Escribí un contenedor ligero alrededor de libxml que puede ser útil:

Objective-C-HMTL-Parser

Esto probablemente depende de lo desordenado que sea el HTML y de lo que quieras extraer. Pero generalmente Tidy hace un buen trabajo. Está escrito en C y supongo que deberías poder construirlo y vincularlo estáticamente para el iPhone. Puede instalar fácilmente la versión de línea de comandos y probar los resultados primero.

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

¿Qué tal 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 marcos de JavaScript?

La API GData Objective-C de Google vuelve a implementar NSXMLElement y otras clases relacionadas que Apple eliminó del SDK de iPhone. 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 tiene un formato incorrecto (faltan etiquetas de cierre), esto podría no ayudar mucho.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top