Domanda

Ho un file HTML (codifica UTF-8). Apro con codecs.open(). L'architettura del file è:

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

Ho bisogno di recuperare solo prima tabella (scarta quella con modulo). Omettere tutti gli input prima della prima e dopo <table> corrispondente </table>. Alcune cellule contiene anche paragrafi, grassetto e script. Non v'è più di una tabella nidificata per ogni riga della tabella principale.

Come posso estrarre per ottenere un elenco di righe, in cui ogni elemento contiene i dati semplici (stringa Unicode) di cellulari e un elenco di righe per ogni tabella annidata? Non c'è più di 1 livello di nidificazione.

ho provato HTMLParse, PyParse e ri modulo, ma non riesco a ottenere questo lavoro. Sono abbastanza nuovo a Python.

È stato utile?

Soluzione

bella zuppa

In linea di principio è necessario utilizzare un vero e proprio parser (che Beaut. Zuppa è), regex non può trattare con gli elementi annidati, per il calcolatore ragioni sciencey (macchine a stati finiti non può analizzare grammatiche context-free, IIRC)

Altri suggerimenti

È possibile, come lxml . Io non sono sicuro di aver capito veramente che cosa si vuole fare con quella struttura, ma forse questo esempio aiuterà ...

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 l'HTML è ben formato è possibile analizzare in un albero DOM e utilizzare XPath per estrarre la tabella che si desidera. Io di solito uso lxml per il parsing XML, e può analizzare HTML pure .

Il XPath per tirare fuori la prima tabella sarebbe "// tabella [1]".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top