【问题标题】:Python and Html - Producing TablesPython 和 Html - 生成表格
【发布时间】:2023-03-09 18:35:01
【问题描述】:

我想知道您将如何摆脱由 2 列表格制成的“杂散”框(蓝色圆圈)。这就是发生的事情:

这是我的python代码:

file_name = 'test.html'

test_file = open('test.html', 'w')

test_file.write('''<!DOCTYPE html>
<html>
    <head>
        <title> Dogs </title>
    </head>
    <body> 
        <table width="500" border="2" cellpadding="5">
''')

dog_names = ['Bob', 'Kenny', 'Robin', 'Ben', 'Tom', 'Steve']
cat_names = ['Gob', 'Smith', 'Tod', 'Flamingo', 'Dragon', 'Fluffy']

index_dog = 0
index_cat = 0
amount = 5

for i in range(amount):
    if index_dog % 2 == 0:
        test_file.write('''          
        <tr>
            <td align="center" valign="center">
                <p>''' + dog_names[index_dog]+ '''</p>
            </td>''')
    else:
        test_file.write('''    <td align="center" align="center">
                <p>''' + dog_names[index_dog]+ '''</p>
            </td>
        </tr>\n''')
    index_dog += 1

for i in range(amount):
    if index_cat % 2 == 0:
        test_file.write('''          
        <tr>
            <td align="center" valign="center">
                <p>''' + cat_names[index_cat]+ '''</p>
            </td>''')
    else:
        test_file.write('''    <td align="center" align="center">
                <p>''' + cat_names[index_cat]+ '''</p>
            </td>
        </tr>\n''')
    index_cat += 1

test_file.write('''\n        </table>
    </body>
</html> ''')

Python 生成的 HTML 代码:

<!DOCTYPE html>
<html>
    <head>
        <title> Dogs </title>
    </head>
    <body> 
        <table width="500" border="2" cellpadding="5">

        <tr>
            <td align="center" valign="center">
                <p>Bob</p>
            </td>    <td align="center" align="center">
                <p>Kenny</p>
            </td>
        </tr>

        <tr>
            <td align="center" valign="center">
                <p>Robin</p>
            </td>    <td align="center" align="center">
                <p>Ben</p>
            </td>
        </tr>

        <tr>
            <td align="center" valign="center">
                <p>Tom</p>
            </td>          
        <tr>
            <td align="center" valign="center">
                <p>Gob</p>
            </td>    <td align="center" align="center">
                <p>Smith</p>
            </td>
        </tr>

        <tr>
            <td align="center" valign="center">
                <p>Tod</p>
            </td>    <td align="center" align="center">
                <p>Flamingo</p>
            </td>
        </tr>

        <tr>
            <td align="center" valign="center">
                <p>Dragon</p>
            </td>
        </table>
    </body>
</html> 

我刚刚发现,如果您为狗和猫(3 和 4)提供不同的值,它仍然会创建奇数框。我将如何删除它?

【问题讨论】:

  • 你能澄清一下“摆脱”的确切含义吗?
  • 只是删除里面没有任何东西的盒子,例如“gob”将进入第一个空白框

标签: python html list html-table


【解决方案1】:

你为什么不把两个列表加入并作为一个列表来对待,例如:

for i, name in enumerate(dog_names[:amount] + cat_names[:amount]):
    if i % 2 == 0:
        test_file.write('''
        <tr>
            <td align="center" valign="center">
                <p>''' + name + '''</p>
            </td>''')
    else:
        test_file.write('''    <td align="center" align="center">
                <p>''' +  name + '''</p>
            </td>
        </tr>\n''')

如果这些列表很长,那么我会推荐 itertools.islice()itertools.chain() 而不是添加列表,但对于小列表应该没问题。

就个人而言,我只会一次迭代列表 2 并将字符串模板化:

iterable = it.chain(it.islice(dog_names, amount), it.islice(cat_names, amount))
cols = 2
for names in iter(lambda: tuple(it.islice(iterable, cols)), tuple()):
    test_file.write('''
        <tr>
    ''')
    for name in names:
        test_file.write('''
            <td align="center" valign="center">
                <p>{}</p>
            </td>'''.format(name))
    test_file.write('''
        </tr>
    ''')

【讨论】:

  • 我只是使用非常短的列表来举例说明我的问题,这是一个更大的问题。但这也很好。
【解决方案2】:

你需要在狗和猫之间保留一个共享索引,以记住你是在左边还是右边完成狗

shared_index = 0
for i in range(amount):
    if shared_index % 2 == 0:
        test_file.write('''          
        <tr>
            <td align="center" valign="center">
                <p>''' + dog_names[i]+ '''</p>
            </td>''')
    else:
        test_file.write('''    <td align="center" align="center">
                <p>''' + dog_names[i]+ '''</p>
            </td>
        </tr>\n''')
    shared_index += 1

for i in range(amount):
    if shared_index % 2 == 0:
        test_file.write('''          
        <tr>
            <td align="center" valign="center">
                <p>''' + cat_names[i]+ '''</p>
            </td>''')
    else:
        test_file.write('''    <td align="center" align="center">
                <p>''' + cat_names[i]+ '''</p>
            </td>
        </tr>\n''')
    shared_index += 1

但是你有六个狗名和猫名。通过限制为 5,您将永远不会看到 SteveFluffy

【讨论】:

  • 是的,我正在尝试排除史蒂夫和蓬松。
  • 我刚刚发现,如果你为狗和猫(3 和 4)赋予不同的值,它仍然会创建奇数框。我将如何删除它?
  • 将列表连接在一起可以避免出现特殊情况。
  • 但是它不会仍然在表格中创建一个没有任何内容的框,因为它是一个奇数。
  • 只在最后。
【解决方案3】:

在这两个 tr 中只有一个 td,这就是你得到那些空白区域的原因。请为每个 tr 添加一个 td 或将 colspan="2" 添加到 td。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2020-02-04
    • 1970-01-01
    • 2013-02-03
    • 1970-01-01
    相关资源
    最近更新 更多