我在 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
