¿Alguien puede recomendar un C o Objective-C de la biblioteca para el análisis de HTML? Que necesita para manejar desordenado código HTML que realmente no validar.

Hace una biblioteca de existir, o soy yo mejor simplemente tratando de usar expresiones regulares?

  • Me gusta Ben Reeves ligero contenedor, que se menciona en este hilo. Contenedor se ha movido en github: Objective-C-HTML-Parser
  • Cómo es que esta cuestión «no constructiva»?

9 Comentarios

  1. 89

    He encontrado usando hpple muy útil para analizar desordenado HTML. Hpple es un proyecto de Objective-C contenedor en el XPathQuery biblioteca para analizar HTML. Usándolo usted puede enviar una consulta XPath y recibir el resultado .

    Requisitos:

    -Añadir libxml2 incluye a su proyecto

    1. Menú Proyecto->Editar la Configuración del Proyecto
    2. De la búsqueda para «configuración de Encabezado de Rutas de Búsqueda»
    3. Agregar una nueva ruta de búsqueda «${SDKROOT}/usr/include/libxml2»
    4. Habilitar la opción recursiva

    -Añadir libxml2 biblioteca para su proyecto

    1. Menú Proyecto->Editar la Configuración del Proyecto
    2. Búsqueda de configuración «Otros Enlazador»
    3. Agregar un nuevo indicador de búsqueda «-lxml2»

    -De hpple obtener los siguientes archivos de código fuente de un agregarlos a su proyecto:

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

    -Tome un paseo en w3school XPath Tutorial se sienta 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 a través de XPathQuery que es otro contenedor, esta opción probablemente no es el más eficiente. Si el rendimiento es un problema en su proyecto, recomiendo el código de su propia solución ligera basada en hpple y xpathquery código de la biblioteca.

    • He utilizado este justo ahora, y ha funcionado muy bien hasta ahora.
    • Se está trabajando muy bien con los Datos de Cadena. Puede usted por favor decirme cómo puedo obtener y mostrar una Imagen desde el html ?
    • Askhay, las imágenes no se almacenan en el HTML. Usted debe obtener la URL de descarga y usted mismo. Usted podría utilizar el [NSData dataWithContentsOfURL] para obtener el archivo una vez que tienes la URL.
    • Desde Jul 8, 2011 el método search: de TFHpple se cambió el nombre a searchWithXPathQuery: Consulte https://github.com/topfunky/hpple/commit/fd5ec102a55ce08f68c6f2060acfcdfb2d3a13a3
    • Esto funcionó muy bien para mí, gracias. Tengo un capricho extraño donde los nombres de archivo, parecen tener un carácter de espacio antepone a ellos, pero esto puede estar ocurriendo debido a un error de codificación y no tienen nada que ver con hpple.
    • Puede agregar o quitar elementos mediante Hpple?

  2. 49

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

    Este módulo implementa un HTML 4.0 no la verificación del analizador con la API compatible con el analizador de XML queridos. Debe ser capaz de analizar el «mundo real» de HTML, aunque gravemente roto a partir de una especificación de punto de vista.

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

  3. 20

    Sólo en caso de que alguien ha llegado aquí buscando en google para un buen analizador de XPath y se ha ido fuera y se utiliza TFHpple, tenga en cuenta que TFHpple utiliza XPathQuery. Esto es bastante buena, pero tiene una pérdida de memoria.

    De la función *PerformXPathQuery, si los nodos se encuentran para ser nulo, se salta antes de la limpieza.

    Así que cuando usted vea este trozo de código: Agregar en el dos de limpieza de líneas.

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

    Si usted está haciendo un MONTÓN de análisis, es un círculo vicioso de pérdida.
    Ahora…. cómo hago para que mi noche de vuelta 🙂

    • Sólo puedo encontrar Hpple que no ha sido actualizada desde el año 2009. Donde puedo encontrar este «TFHpple»?
    • github.com/topfunky/hpple – Sí, creo que es bastante antiguo. Funciona bien, aunque una vez que arreglar la fuga.
    • Se parece a esta revisión se actualizó en el último commit
  4. 5

    Esto probablemente depende de cómo desordenado el HTML que es y lo que desea extraer. Pero generalmente Ordenado hace un buen trabajo. Está escrito en C y supongo que usted debe ser capaz de construir y enlazar estáticamente para el iPhone. Usted puede instalar la versión de línea de comandos de prueba y los resultados de la primera.

  5. 4

    Cómo sobre el uso de la Webkit componente, y posiblemente de paquetes de terceros, tales como jquery para tareas como estas? ¿No sería posible obtener los datos html en un componente invisible y tomar ventaja de los muy maduros selectores de los frameworks de javascript?

  6. 3

    De Google GData Objective-C API reimplemente NSXMLElement y otras clases relacionadas que Apple retiró de la SDK del iPhone. Usted puede encontrar aquí http://code.google.com/p/gdata-objectivec-client/. Lo he utilizado para tratar de mensajería a través de Jabber. Por supuesto, si el código HTML es incorrecto (faltan las etiquetas de cierre) puede que esto no ayuda mucho.

  7. 3

    Utilizamos Convertigo para analizar HTML en el lado del servidor y devolver un limpio y ordenado, JSON, web services para nuestras Aplicaciones Móviles

    • Esto no contesta a la pregunta – él está buscando una biblioteca de cliente.

Dejar respuesta

Please enter your comment!
Please enter your name here