Pergunta

Eu tenho que analisar uma série de páginas da web, a fim de importar dados para um aplicativo. Cada tipo de página web fornece o mesmo tipo de dados. O problema é que o HTML de cada página é diferente, portanto a localização dos dados varia. Outro problema é que o código HTML é mal formatado, o que torna impossível usar um parser XML-like.

Até agora, a melhor estratégia que eu posso pensar, é definir um modelo para cada tipo de página, como:

Modelo A:

<html>
...
  <tr><td>Table column that is missing a td 
      <td> Another table column</td></tr>
  <tr><td>$data_item_1$</td>
...
</html>

Modelo B:

<html>
...
  <ul><li>Yet another poorly formatted page <li>$data_item_1$</td></tr>
...
</html>

Desta forma, eu só precisa de um único analisador para todas as páginas, que iria comparar cada página com o seu modelo e recuperar o $data_item_1$, $data_item_2$, etc. Ainda assim, vai ser um monte de trabalho. Você pode pensar em alguma solução mais simples? Qualquer biblioteca que pode ajudar?

Graças

Foi útil?

Solução

Você pode passar-fonte da página através arrumado para obter uma página válida. Você pode encontrar arrumado aqui . Tidy tem ligações para um monte de linguagens de programação. Depois de ter feito isso, você pode usar sua técnica favorita analisador / conteúdo de extração.

Outras dicas

Eu recomendo Html agilidade Pacote . Ele tem a capacidade de trabalhar com HTML mal estruturado e dando-lhe XML como selecção usando XPath. Você ainda teria de artigos do modelo ou selecione usando diferentes seleções e analisar, mas ele vai começar após a estrutura pobre corcunda.

Como mencionado aqui e em outras respostas por isso antes, Beautiful Soup pode analisar HTML estranho.

Beautiful Soup é um parser Python HTML / XML projetado para projetos de resposta rápida como screen-scraping. Três características tornam poderosa:

  1. Beautiful Soup não vai engasgar se dar mal marcação. Ela produz uma árvore de análise que faz aproximadamente tanto sentido quanto o documento original. Isso geralmente é bom o suficiente para coletar os dados que você precisa e fugir.
  2. Beautiful Soup fornece alguns métodos simples e expressões idiomáticas Pythonic para navegar, pesquisar e modificar uma árvore de análise: um kit de ferramentas para dissecar um documento e extrair o que você precisa. Você não tem que criar um analisador personalizado para cada aplicação.
  3. Beautiful Soup converte automaticamente documentos recebidos para Unicode e documentos de saída para UTF-8. Você não tem que pensar sobre codificações, a menos que o documento não especificar uma codificação and Beautiful Soup não pode detectar automaticamente um. Então você só tem que especificar a codificação original.

Beautiful Soup analisa qualquer coisa que você dá-lo, e faz o material passagem de árvore para você. Você pode dizer que "Localizar todos os links", ou "Localizar todos os elos da classe externalLink", ou "Localizar todos os links cujos URLs corresponder 'foo.com', ou" Encontre o cabeçalho da tabela que tem texto em negrito, em seguida, dar me esse texto."

analisador Use HTML5 como html5lib .

Ao contrário do HTML Tidy, isso vai lhe dar manipulação de erros muito próximo ao que navegadores fazer.

Há um par C # tópicos específicos sobre isso, como Procurando por C # HTML parser .

Dependendo do que os dados que você precisa para extrair expressões regulares pode ser uma opção. Eu conheço um monte de gente vai estremecer com a idéia de usar expressões regulares em dados estruturados, mas o fato é (como você descobriu) que um monte de HTML não é realmente bem estruturado e pode ser muito difícil de análise.

Eu tive um problema semelhante a você, mas no meu caso eu só queria um pedaço específico de dados da página em que era fácil de identificar, sem analisar o HTML para um RegEx trabalhou muito bem.

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