2012-05-04 2 views
2

Я работаю над HTML-таблицами, используя python., работающий на простых таблицах столбцов таблицы HTML

Я хочу знать, как я могу получить разные значения столбцов с помощью lxml?

HTML таблицы:

<table border="1"> 
<tr> 
<td>Header_1</td> 
<td>Header_2</td> 
<td>Header_3</td> 
<td>Header_4</td> 
</tr> 
<tr> 
<td>row 1_cell 1</td> 
<td>row 1_cell 2</td> 
<td>row 1_cell 3</td> 
<td>row 1_cell 4</td> 
</tr> 
<tr> 
<td>row 2_cell 1</td> 
<td>row 2_cell 2</td> 
<td>row 1_cell 3</td> 
<td>row 1_cell 4</td> 
</tr> 
<tr> 
<td>row 3_cell 1</td> 
<td>row 3_cell 2</td> 
<td>row 1_cell 3</td> 
<td>row 1_cell 4</td> 
</tr> 
<tr> 
<td>row 4_cell 1</td> 
<td>row 4_cell 2</td> 
<td>row 1_cell 3</td> 
<td>row 1_cell 4</td> 
</tr> 
</table>  

и я ищу, чтобы получить результат, как:

[ 
[ 
('Header_1', 'Header_2'), 
('row 1_cell 1', 'row 1_cell 2'), 
('row 2_cell 1', 'row 2_cell 2'), 
('row 3_cell 1', 'row 3_cell 2'), 
('row 4_cell 1', 'row 4_cell 2') 
], 
[ 
('Header_1', 'Header_3'), 
('row 1_cell 1', 'row 1_cell 3'), 
('row 2_cell 1', 'row 2_cell 3'), 
('row 3_cell 1', 'row 3_cell 2'), 
('row 4_cell 1', 'row 4_cell 3') 
] 
] 

как я могу принести такой другой столбец и их значения?

+0

вы можете использовать XML с помощью XSLT анализировать и преобразовывать результат? –

+0

@sam проверить мое решение. –

+0

@AshwiniChaudhary: где решение? – sam

ответ

-1

Посмотрите на LXML как анализатор html/xml, который вы можете использовать. Тогда просто сделайте рекурсивную функцию.

1

Я не знаю, как вы делаете выбор Header1 + Header2, или Header1 + Header3, ... Поскольку таблицы должны быть достаточно маленькими, я предлагаю собрать все данные, и только потом извлечь желаемый подмножества таблицы. Следующий код показывает возможное решение:

import lxml.etree as ET 

def parseTable(table_fragment): 
    header = None # init - only to create the variable (name) 
    rows = []  # init 

    # Parse the table with lxml (the standard xml.etree.ElementTree would be also fine). 
    tab = ET.fromstring(table_fragment) 
    for tr in tab: 
     lst = [] 
     if header is None: 
      header = lst 
     else: 
      rows.append(lst) 

     for e in tr: 
      lst.append(e.text) 

    return header, rows 


def extractColumns(header, rows, clst): 
    header2 = [] 
    for i in clst: 
     header2.append(header[i - 1]) # one-based to zero-based 

    rows2 = [] 
    for row in rows: 
     lst = [] 
     rows2.append(lst) 
     for i in clst: 
      lst.append(row[i - 1])  # one-based to zero-based 

    return header2, rows2 


def myRepr(header, rows): 
    out = [repr(tuple(header))]   # init -- list with header 
    for row in rows: 
     out.append(repr(tuple(row))) # another row 
    return '[\n' + (',\n'.join(out)) + '\n]' # join to string 



table_fragment = '''\ 
<table border="1"> 
<tr> 
<td>Header_1</td> 
<td>Header_2</td> 
<td>Header_3</td> 
<td>Header_4</td> 
</tr> 
<tr> 
<td>row 1_cell 1</td> 
<td>row 1_cell 2</td> 
<td>row 1_cell 3</td> 
<td>row 1_cell 4</td> 
</tr> 
<tr> 
<td>row 2_cell 1</td> 
<td>row 2_cell 2</td> 
<td>row 1_cell 3</td> 
<td>row 1_cell 4</td> 
</tr> 
<tr> 
<td>row 3_cell 1</td> 
<td>row 3_cell 2</td> 
<td>row 1_cell 3</td> 
<td>row 1_cell 4</td> 
</tr> 
<tr> 
<td>row 4_cell 1</td> 
<td>row 4_cell 2</td> 
<td>row 1_cell 3</td> 
<td>row 1_cell 4</td> 
</tr> 
</table>''' 


# Parse the table 
header, rows = parseTable(table_fragment) 

# For debugging... 
print header 
print rows 

# Collect the representations of the selections. The extractColumns() 
# returns a tuple. The * expands it to two arguments. 
lst = [] 
lst.append(myRepr(header, rows)) 
lst.append(myRepr(*extractColumns(header, rows, [1, 2]))) 
lst.append(myRepr(*extractColumns(header, rows, [1, 3]))) 
lst.append(myRepr(*extractColumns(header, rows, [1, 2, 4]))) 

# Write the output. 
with open('output.txt', 'w') as f: 
    f.write('[\n') 
    f.write(',\n'.join(lst)) 
    f.write('\n]') 

output.txt теперь содержит:

[ 
[ 
('Header_1', 'Header_2', 'Header_3', 'Header_4'), 
('row 1_cell 1', 'row 1_cell 2', 'row 1_cell 3', 'row 1_cell 4'), 
('row 2_cell 1', 'row 2_cell 2', 'row 1_cell 3', 'row 1_cell 4'), 
('row 3_cell 1', 'row 3_cell 2', 'row 1_cell 3', 'row 1_cell 4'), 
('row 4_cell 1', 'row 4_cell 2', 'row 1_cell 3', 'row 1_cell 4') 
], 
[ 
('Header_1', 'Header_2'), 
('row 1_cell 1', 'row 1_cell 2'), 
('row 2_cell 1', 'row 2_cell 2'), 
('row 3_cell 1', 'row 3_cell 2'), 
('row 4_cell 1', 'row 4_cell 2') 
], 
[ 
('Header_1', 'Header_3'), 
('row 1_cell 1', 'row 1_cell 3'), 
('row 2_cell 1', 'row 1_cell 3'), 
('row 3_cell 1', 'row 1_cell 3'), 
('row 4_cell 1', 'row 1_cell 3') 
], 
[ 
('Header_1', 'Header_2', 'Header_4'), 
('row 1_cell 1', 'row 1_cell 2', 'row 1_cell 4'), 
('row 2_cell 1', 'row 2_cell 2', 'row 1_cell 4'), 
('row 3_cell 1', 'row 3_cell 2', 'row 1_cell 4'), 
('row 4_cell 1', 'row 4_cell 2', 'row 1_cell 4') 
] 
] 
Смежные вопросы