Pregunta

Tengo un archivo HTML (codificado en UTF-8). Lo abro con codecs.open(). La arquitectura del archivo es:

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

Necesito recuperar sólo la primera tabla (deseche el que tiene la forma). Omitir toda entrada antes de primera <table> y después de </table> correspondiente. Algunas células contienen también los párrafos, las negritas y scripts. No hay más de una tabla anidada por fila de la tabla principal.

¿Cómo puedo extraer para obtener una lista de filas, donde cada elemento ocupa el (cadena Unicode) los datos de las células planas y una lista de filas para cada tabla anidada? No hay más de 1 nivel de anidamiento.

He intentado HTMLParse, PyParse y re módulo, pero no puedo conseguir este trabajo. Soy bastante nuevo en Python.

¿Fue útil?

Solución

Trate hermosa sopa

En principio es necesario utilizar un programa de análisis real (que Beaut. La sopa es), expresiones regulares no puede hacer frente a los elementos anidados, por razones sciencey informáticos (máquinas de estados finitos no puede analizar gramáticas libres de contexto, IIRC)

Otros consejos

Es posible que como lxml . No estoy seguro de que realmente entiende lo que quiere hacer con esa estructura, pero tal vez este ejemplo le ayudará ...

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))

Si está bien formado el código HTML que puede analizar en un árbol DOM y utilizar XPath para extraer la tabla que desea. Yo suelo usar lxml para analizar XML, y se puede analizar HTML, así .

El XPath para la retirada de la primera mesa estaría "// tabla [1]".

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