Skip to main content
 首页 » 编程设计

python之有没有更 Pythonic 的方法来合并两个 HTML 标题行与 colspans

2025年05月04日18dudu

我在 Python 中使用 BeautifulSoup 来解析一些 HTML。我正在处理的问题之一是,我遇到了跨标题行的 colspans 不同的情况。 (标题行是需要组合以获取我的行话中的列标题的行)这是一列可能跨越其上方或下方的多个列,并且需要根据跨越来附加或前置单词。下面是执行此操作的例程。我使用 BeautifulSoup 拉取 colspans 并拉取每行中每个单元格的内容。 longHeader 是包含最多项目的标题行的内容,spanLong 是一个列表,其中包含该行中每个项目的 colspans。这可行,但看起来不是很 Pythonic。

Alos-如果 diff <0,它就不会工作,我可以用我用来让它工作的相同方法来解决这个问题。但在我这样做之前,我想知道是否有人可以快速查看这个并提出一个更 Pythonic 的方法。我是一个长期的 SAS 程序员,所以我努力打破陈规——我会像编写 SAS 宏一样编写代码。

longHeader=['','','bananas','','','','','','','','','','trains','','planes','','','',''] 
shortHeader=['','','bunches','','cars','','trucks','','freight','','cargo','','all other','',''] 
spanShort=[1,1,3,1,3,1,3,1,3,1,3,1,3,1,3] 
spanLong=[1,1,3,1,1,1,1,1,1,1,1,1,3,1,3,1,3,1,3] 
combinedHeader=[] 
sumSpanLong=0 
sumSpanShort=0 
spanDiff=0 
longHeaderCount=0 
 
for each in range(len(shortHeader)): 
    sumSpanLong=sumSpanLong+spanLong[longHeaderCount] 
    sumSpanShort=sumSpanShort+spanShort[each] 
    spanDiff=sumSpanShort-sumSpanLong 
    if spanDiff==0: 
        combinedHeader.append([longHeader[longHeaderCount]+' '+shortHeader[each]]) 
        longHeaderCount=longHeaderCount+1 
        continue 
    for i in range(0,spanDiff): 
            combinedHeader.append([longHeader[longHeaderCount]+' '+shortHeader[each]]) 
            longHeaderCount=longHeaderCount+1 
            sumSpanLong=sumSpanLong+spanLong[longHeaderCount] 
            spanDiff=sumSpanShort-sumSpanLong 
            if spanDiff==0: 
                combinedHeader.append([longHeader[longHeaderCount]+' '+shortHeader[each]]) 
                longHeaderCount=longHeaderCount+1 
                break 
 
print combinedHeader 

请您参考如下方法:

这是您的算法的修改版本。 zip 用于迭代短 长度和标题,类对象 用于计算和迭代长项,以及合并标题。 while 更适合内循环。 (请原谅太短的名字)。

class collector(object): 
    def __init__(self, header): 
        self.longHeader = header 
        self.combinedHeader = [] 
        self.longHeaderCount = 0 
    def combine(self, shortValue): 
        self.combinedHeader.append( 
            [self.longHeader[self.longHeaderCount]+' '+shortValue] ) 
        self.longHeaderCount += 1 
        return self.longHeaderCount 
 
def main(): 
    longHeader = [  
       '','','bananas','','','','','','','','','','trains','','planes','','','',''] 
    shortHeader = [ 
    '','','bunches','','cars','','trucks','','freight','','cargo','','all other','',''] 
    spanShort=[1,1,3,1,3,1,3,1,3,1,3,1,3,1,3] 
    spanLong=[1,1,3,1,1,1,1,1,1,1,1,1,3,1,3,1,3,1,3] 
    sumSpanLong=0 
    sumSpanShort=0 
 
    combiner = collector(longHeader) 
    for sLen,sHead in zip(spanShort,shortHeader): 
        sumSpanLong += spanLong[combiner.longHeaderCount] 
        sumSpanShort += sLen 
        while sumSpanShort - sumSpanLong > 0: 
            combiner.combine(sHead) 
            sumSpanLong += spanLong[combiner.longHeaderCount] 
        combiner.combine(sHead) 
 
    return combiner.combinedHeader