Come estrarre le tabelle nidificate da HTML?
-
09-09-2019 - |
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.
Soluzione
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]".