Pergunta

Eu tenho um arquivo HTML (codificado no UTF-8). Eu abro -o com codecs.open(). A arquitetura de arquivos é:

<html>
// header
<body>
  // some text
  <table>
    // some rows with cells here
    // some cells contains tables
  </table>
  // maybe some text here
  <table>
    // a form and other stuff
  </table>
  // probably some more text
</body></html>

Eu preciso recuperar apenas a primeira tabela (descarte a de forma). Omita todas as informações antes do primeiro <table> e depois de corresponder </table>. Algumas células também contêm parágrafos, negrito e scripts. Não há mais de uma tabela aninhada por linha da tabela principal.

Como posso extraí -lo para obter uma lista de linhas, onde cada elementos mantém os dados da célula simples (unicode string) e uma lista de linhas para cada tabela aninhada? Não há mais de 1 nível de ninho.

Eu tentei o módulo HTMLPARSE, PYPARSE e RE, mas não consigo fazer isso funcionando. Eu sou muito novo no Python.

Foi útil?

Solução

Tentar Linda sopa

Em princípio, você precisa usar um analisador real (que é a sopa), Regex não pode lidar com elementos aninhados, por razões científicas da computação (as máquinas de estado finitas não podem analisar gramáticas sem contexto, IIRC)

Outras dicas

Você pode gostar lxml. Não tenho certeza se realmente entendi o que você quer fazer com essa estrutura, mas talvez este exemplo ajude ...

import lxml.html

def process_row(row):
    for cell in row.xpath('./td'):
       inner_tables = cell.xpath('./table')
       if len(inner_tables) < 1:
           yield cell.text_content()
       else:
           yield [process_table(t) for t in inner_tables]

def process_table(table):
    return [process_row(row) for row in table.xpath('./tr')]

html = lxml.html.parse('test.html')
first_table = html.xpath('//body/table[1]')[0]

data = process_table(first_table))

Se o HTML estiver bem formado, você poderá analisá-lo em uma árvore Dom e usar o XPath para extrair a tabela desejada. Eu costumo usar lxml para analisar XML e pode analisar HTML também.

O XPath por retirar a primeira tabela seria "// tabela [1].

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