Как избежать цикличности при тестировании элементов в lxml - PullRequest
0 голосов
/ 16 февраля 2012

У меня есть эта проблема, я обрабатываю некоторые таблицы с использованием lxml - исходные файлы в формате mhtml, они являются файлами Excel.Мне нужно найти строки, которые содержат элементы заголовка 'th' элементов.Я хочу использовать элементы заголовка, но мне нужны строки, из которых они получены, чтобы убедиться, что я обрабатываю все по порядку.

Итак, я занимался поиском всех элементов th, а затем элементов, использующих e.Функция getparent () для получения строки (так как th является дочерним элементом строки).Но в итоге мне приходится тянуть th-ые элементы дважды, один раз, чтобы найти их и получить строки, а затем снова вынуть их из строк, чтобы проанализировать данные, которые я ищу.Это не может быть лучшим способом сделать это, поэтому мне интересно, есть ли что-то, что мне не хватает.

Вот мой код

from lxml import html
theString=unicode(open('c:\\secexcel\\1314054-R20110331-C20101231-F60-SEQ132.xls').read(),'UTF-8','replace')
theTree=html.fromstring(theString)
tables=[e for e in theTree.iter() if e.tag=='table']
for table in tables :
    headerCells=[e for e in table.iter() if e.tag=='th']
    headerRows=[]
    for headerCell in headerCells:
        if headerCell.getparent().tag=='tr':
            if headerCell.getparent() not in headerRows:
                headerRows.append(headerCell.getparent())
    for headerRow in headerRows:
        newHeaderCells=[e for e in headerRow.iter() if e.tag=='th']
        #Now I will extract some data and attributes from the th elements

Ответы [ 2 ]

1 голос
/ 17 февраля 2012

Чтобы не делать это дважды, вы можете использовать словарь с ключом по элементу строки и собирать все ячейки заголовка из данной строки в связанный список, что можно сделать за один проход по элементам таблицы.Чтобы сохранить порядок строк по времени их просмотра, вы можете использовать OrderedDict из встроенного модуля collections.Это позволило бы написать что-то вроде этого:

from lxml import html
from collections import OrderedDict
f='c:\\secexcel\\1314054-R20110331-C20101231-F60-SEQ132.xls'
theString=unicode(open(f).read(),'UTF-8','replace')
theTree=html.fromstring(theString)
tables=[e for e in theTree.iter() if e.tag=='table']
for table in tables:
    headerRowDict=OrderedDict()
    for e in table.iter():
        if e.tag=='th':
            headerRowDict.setdefault(e.getparent(), []).append(e)
    for headerRow in headerRowDict:
        for headerRowCell in headerRow:
            # extract data and attributes from the <th> element from the row...
1 голос
/ 16 февраля 2012

Переберите все теги tr и просто переходите к следующему, когда вы не найдете th внутри.Вот как:

from lxml import html
theString=unicode(open('c:\\secexcel\\1314054-R20110331-C20101231-F60-SEQ132.xls').read(),'UTF-8','replace')
theTree=html.fromstring(theString)
for table in theTree.iter('table'):
    for row in table.findall('tr'):
        headerCells = list(row.findall('th'))
        if headerCells:
            #extract data from row and headerCells 
...