按相邻属性值分组lxml元素的列表

时间:2015-06-29 22:08:00

标签: python

我有一些html表格行,如下所示

<tr class="even"></tr>
<tr class="even"></tr>
<tr class="odd"></tr>
<tr class="odd"></tr>
<tr class="odd"></tr>
<tr class="even"></tr>

我使用lxml获取tr元素列表:

trs = lxml.html.fromstring(html_str).xpath('//tr')

我想将这些tr元素组合成一个列表列表:

[
 [<tr class="even">,<tr class="even">],
 [<tr class="odd">,<tr class="odd">,<tr class="odd">],
 [<tr class="even">]
]

即,将具有相同类的相邻行组合在一起。到目前为止,我已经实现了以下循环结构:

grouped, grp, last = [], [], trs[0].get('class')
for tr in trs:
    cl = tr.get('class')
    if last != cl:
        grouped.append(grp)
        grp = []
    grp.append(tr)
    last = cl
grouped.append(grp)

有没有简单,优雅和pythonic的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

也许使用itertools.groupby方法会更好。

因此,您可以使用以下命令获取包含元素的列表列表:

from itertools import groupby

groupped = groupby(trs, key=lambda tag: tag.attrib.get('class'))

groups = []
for key, group in groupped:
    groups.append(list(group))