Pergunta

Alguém pode recomendar um C ou biblioteca Objective-C para HTML parsing? Ele precisa lidar com código HTML confuso que não vai bastante validar.

Será que a existência de tais biblioteca, ou estou melhor fora apenas tentando usar expressões regulares?

Foi útil?

Solução 2

Looks como libxml2.2 vem no SDK, e libxml/HTMLparser.h afirma o seguinte:

Este módulo implementa um HTML 4.0 do analisador não verificar com API compatível com os parser XML. Ele deve ser capaz de analisar "mundo real" HTML, mesmo se severamente quebrado a partir de um ponto de especificação de vista.

Isso soa como o que eu preciso, então eu provavelmente vou usar isso.

Outras dicas

Eu encontrei usando hpple bastante útil para analisar confuso HTML. projeto Hpple é um wrapper Objective-C na biblioteca XPathQuery para análise de HTML. Através dela você pode enviar uma consulta XPath e receber o resultado.

Requisitos :

-Add libxml2 inclui em seu projeto

  1. Menu Projeto-> Editar Configurações do projeto
  2. Pesquise definição "cabeçalho caminhos de pesquisa"
  3. Adicionar um novo caminho de pesquisa "$ {SDKROOT} / usr / include / libxml2"
  4. Ativar opção recursiva

-Add libxml2 biblioteca para o seu projeto

  1. Menu Projeto-> Editar Configurações do projeto
  2. Pesquise configuração "Outras Bandeiras Linker"
  3. Adicionar um novo sinalizador de pesquisa "-lxml2"

hpple pegue os seguintes arquivos de código fonte um add-los ao seu projeto:

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

-Leve um passeio na w3school XPath Tutorial para se sentir confortável com a linguagem XPath.

Exemplo 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 conhecidos

Como hpple é um wrapper sobre XPathQuery que é um outro invólucro, esta opção não é provavelmente o mais eficiente. Se o desempenho for um problema em seu projeto, eu recomendo ao código sua própria solução leve baseado em hpple e xpathquery código da biblioteca.

Apenas no caso de alguém já chegou aqui por googling para um analisador agradável XPath e ido e usado TFHpple, Note que TFHpple usa XPathQuery. Isso é muito bom, mas tem um vazamento de memória.

Na função * PerformXPathQuery, se os nós são encontrados para ser nulo, ele salta para fora antes de limpar.

Então, onde você ver este pedaço de código:. Adicionar nas duas linhas de limpeza

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

Se você está fazendo um monte de análise, é um vazamento vicioso. Agora .... como faço para obter minha noite de volta: -)

Eu escrevi um invólucro leve em torno libxml que talvez útil:

Objectivo-C-HTML-Analisador

Isso provavelmente depende de quão confuso o HTML é eo que você deseja extrair. Mas normalmente Tidy faz um bom trabalho. Ele é escrito em C e eu acho que você deve ser capaz de construir e estaticamente vinculá-lo para o iPhone. Você pode facilmente instalar a versão de linha de comando e testar os resultados em primeiro lugar.

Você pode querer verificar para fora ElementParser. Ele fornece "apenas o suficiente" análise de HTML e XML. interfaces de bom make andando XML documentos / HTML muito simples. http://touchtank.wordpress.com/

Que tal usar o componente Webkit, e possivelmente terceiros pacotes como o jQuery para tarefas como estas? Não seria possível obter os dados HTML em um componente invisível e aproveitar os muito maduro seletores dos quadros javascript?

GData Objective-C API do Google reimplementa NSXMLElement e outras classes relacionadas que a Apple removidos do iPhone SDK. Você pode encontrá-lo aqui http://code.google.com/p/gdata- objectivec-cliente / . Eu usei-o para lidar mensagens via Jabber. Claro, se o seu HTML é mal formado (faltando marcas de fechamento), este pode não ajudar muito.

Nós usamos Convertigo para analisar HTML no lado do servidor e retornar um ambiente limpo e arrumado serviços JSON web para o nosso Apps móvel

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top