gpt4 book ai didi

python - 使用 rowspan 和 colspan 解析表

转载 作者:太空狗 更新时间:2023-10-29 17:31:16 26 4
gpt4 key购买 nike

我有一个需要解析的表,具体来说,它是一个包含 4 个时间段的学校时间表,每周有 5 个时间段。我已经尝试解析它,但老实说还没有深入,因为我对如何处理 rowspan 和 colspan 属性感到困惑,因为它们本质上意味着缺少我需要继续的数据。

作为我想做的事的一个例子,这里有一张表:

<tr>
<td colspan="2" rowspan="4">#1</td>
<td rowspan="4">#2</td>
<td rowspan="2">#3</td>
<td rowspan="2">#4</td>
</tr>

<tr>
</tr>

<tr>
<td rowspan="2">#5</td>
<td rowspan="2">#6</td>
</tr>

<tr>
</tr>

我想把那个表转换成这个列表:

[[1,1,2,3,4],
[1,1,2,3,4],
[1,1,2,5,6],
[1,1,2,5,6]]

现在我得到一个简单的列表,类似于:

[1,2,3,4,5,6]

但是以字典的形式,包含关于它跨越多少列和行的信息,对它的描述以及它在星期几。

显然,这需要适用于行跨度/列跨度的每一种可能性,并在同一个表中持续多个星期。

html 并不像我描述的那样干净,我遗漏了很多属性,文本显然不像 1,2,3,4 那样清晰,而是描述性 block 文本。但是,如果我能解决这部分问题,那么将它合并到我已经编写的内容中应该就足够容易了。

我一直在使用 lxml.html 和 Python 来执行此操作,但如果它提供更简单的解决方案,我愿意使用其他模块。

我希望有人能帮助我,因为我真的不知道该怎么做。

编辑:

<table>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td rowspan="4">Thing</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>

这给我带来了一些问题,这是输出

[' ', ' ', ' ', 'Thing', ' ']
[' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ']
[' ', ' ', ' ', ' ', ' ']

使用recloseddev提供的代码,我需要修改什么才能适配输出

[' ', ' ', ' ', 'Thing', ' ']
[' ', ' ', ' ', 'Thing', ' ']
[' ', ' ', ' ', 'Thing', ' ']
[' ', ' ', ' ', 'Thing', ' ']

代替?

EDIT2:使用recloseddev的新功能,正在接近解决方案,但仍然存在无法正确放置单元格的情况:

<table> 
<tr>
<td> </td>
<td rowspan="2"> DMAT Aud. 6 </td>
<td rowspan="4"> Exam</td>
<td rowspan="2"> DMAT Aud. 7</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td rowspan="2"> CART Aud. 4</td>
</tr>
<tr>
<td> </td>
<td rowspan="2"> CART Aud. 4</td>
<td rowspan="2"> OOP Aud. 7</td>
</tr>
<tr>
<td> </td>
<td> </td>
</tr>
</table>

有了这个,原来的表格就这样显示了:

[
[' ', ' DMAT Aud. 6 ', ' Exam', ' DMAT Aud. 7', ' '],
[' ', ' DMAT Aud. 6 ', ' Exam', ' DMAT Aud. 7', ' CART Aud. 4'],
[' ', ' CART Aud. 4' , ' Exam', ' OOP Aud. 7' , ' CART Aud. 4'],
[' ', ' CART Aud. 4' , ' Exam', ' OOP Aud. 7' , ' ']
]

但是新的调用输出这个:

[
[' ', ' DMAT Aud. 6 ', ' Exam', ' DMAT Aud. 7', ' '],
[' ', ' DMAT Aud. 6 ', ' Exam', ' DMAT Aud. 7', ' CART Aud. 4'],
[' ', ' CART Aud. 4' , ' Exam', ' CART Aud. 4', ' OOP Aud. 7'],
[' ', ' CART Aud. 4' , ' Exam', ' OOP Aud. 7' , ' ']
]

最佳答案

更新(移除之前的功能)

UPDATE2 修复和简化。

我的第一个功能是错误的。这是另一个,它正在工作但需要测试:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from collections import defaultdict


def table_to_list(table):
dct = table_to_2d_dict(table)
return list(iter_2d_dict(dct))


def table_to_2d_dict(table):
result = defaultdict(lambda : defaultdict(unicode))
for row_i, row in enumerate(table.xpath('./tr')):
for col_i, col in enumerate(row.xpath('./td|./th')):
colspan = int(col.get('colspan', 1))
rowspan = int(col.get('rowspan', 1))
col_data = col.text_content()
while row_i in result and col_i in result[row_i]:
col_i += 1
for i in range(row_i, row_i + rowspan):
for j in range(col_i, col_i + colspan):
result[i][j] = col_data
return result


def iter_2d_dict(dct):
for i, row in sorted(dct.items()):
cols = []
for j, col in sorted(row.items()):
cols.append(col)
yield cols


if __name__ == '__main__':
import lxml.html
from pprint import pprint

doc = lxml.html.parse('tables.html')
for table_el in doc.xpath('//table'):
table = table_to_list(table_el)
pprint(table)

tables.html:

<table border="1">
<tr>
<td>1 </td>
<td>1 </td>
<td>1 </td>
<td rowspan="4">Thing</td>
<td>1 </td>
</tr>
<tr>
<td>2 </td>
<td>2 </td>
<td>2 </td>
<td>2 </td>
</tr>
<tr>
<td>3 </td>
<td>3 </td>
<td>3 </td>
<td>3 </td>
</tr>
<tr>
<td>4 </td>
<td>4 </td>
<td>4 </td>
<td>4 </td>
</tr>
</table>

<table border="1">
<tr>
<td colspan="2" rowspan="4">#1</td>
<td rowspan="4">#2</td>
<td rowspan="2">#3</td>
<td rowspan="2">#4</td>
</tr>
<tr></tr>
<tr>
<td rowspan="2">#5</td>
<td rowspan="2">#6</td>
</tr>
<tr></tr>
</table>

输出:

[['1 ', '1 ', '1 ', 'Thing', '1 '],
['2 ', '2 ', '2 ', 'Thing', '2 '],
['3 ', '3 ', '3 ', 'Thing', '3 '],
['4 ', '4 ', '4 ', 'Thing', '4 ']]
[['#1', '#1', '#2', '#3', '#4'],
['#1', '#1', '#2', '#3', '#4'],
['#1', '#1', '#2', '#5', '#6'],
['#1', '#1', '#2', '#5', '#6']]

关于python - 使用 rowspan 和 colspan 解析表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9978445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com