创建一个循环来打印html列表

时间:2011-09-26 21:17:00

标签: python html loops

我需要创建一个类似于以下内容的html列表:

<ul class="treeView">
    <li>
        Root Item
        <ul class="collapsibleList">
        <li>
            Sub-Folder 1
            <ul>
                <li>
                    Sub-Sub-Folder 1
                    <ul>
                        <li>Item 1</li>
                        <li class="lastChild">Item 2</li>
                    </ul>
                </li>
                <li class="lastChild">
                    Sub-Sub-Folder 2
                    <ul>
                        <li>Item 3</li>
                        <li class="lastChild">Item 4</li>
                    </ul>
                </li>
            </ul>
        </li>
            <li class="lastChild">
                Sub-Folder 2
                <ul>
                    <li>Item 5</li>
                    <li>Item 6</li>
                    <li class="lastChild">Item 7</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

此列表基于目录结构,但我已下载代码以列出实际结构。所以我需要的是如何使用for循环来跟踪所有内容并创建嵌套的html列表。

下面是我到目前为止的python脚本:

for item in lstItems:
    splitfile = os.path.split(item[0])
    webpyPath = splitfile[0].replace("/srv/http/example/www", "")
    itemName = splitfile[1]
    if item[1] == 0:
        lstRemDir.append(itemName)
    intDirNum = len(lstRemDir) - 1
    if item[1] == 0:
        if len(lstRemDir) == 1:
            print '''
<ul class="treeView">
    <li>Collapsible lists
        <ul class="collapsibleList">
            '''
        elif len(lstRemDir) != 1:
            f.write('    </ul>\n</li>')
        f.write('<li><a href=\"' + webpyPath + "/" + itemName + '\" id=\"directory\" alt=\"' + itemName + '\" target=\"viewer\">' + itemName + '</a></li>\n')
    elif item[1] == 1:
        f.write('<li><a href=\"' + webpyPath + "/" + itemName + '\" id=\"file\" alt=\"' + itemName + '\" target=\"viewer\">' + itemName + '</a></li>\n')
    else:
        f.write('<li>An error happened in processing ' + itemName + '.')

我之所以要问的原因是因为我一直想把这个问题弄清楚几天。我不是要求别人为我做这件事,只是一个很好的方法。我曾尝试使用列表存储数据,但我觉得它太混乱了。希望这能澄清我在寻找的东西。

提前致谢!

1 个答案:

答案 0 :(得分:0)

这可能有助于您开始使用嵌套字典来表示文件而不是列表的更简单的解决方案:

dir = {}
start = rootdir.rfind('/')+1
for path, dirs, files in os.walk(rootdir):
    folders = path[start:].split('/')
    subdir = dict.fromkeys(files)
    parent = reduce(dict.get, folders[:-1], dir)
    parent[folders[-1]] = subdir

以下是示例中dir类似结构的示例:

{
    "root": {
        "folder2": {
            "item2": None, 
            "item3": None, 
            "item1": None
        }, 
        "folder1": {
            "subfolder1": {
                "item2": None, 
                "item1": None
            }, 
            "subfolder2": {
                "item3": None, 
                "item4": None
            }
        }
    }
}

使用它,编写一个接受字典并返回html列表的递归函数应该不会太困难。这是一个简单的函数,只是打印出正确级别的项目,你应该可以修改它来添加html代码:

def html_list(nested_dict, indent=0):
    result = ''
    if nested_dict is not None:
        for item in sorted(nested_dict.keys()):
            result += ' '*indent + item + '\n'
            result += html_list(nested_dict[item], indent+4)
    return result

>>> print html_list(dir)
root
    folder1
        subfolder1
            item1
            item2
        subfolder2
            item3
            item4
    folder2
        item1
        item2
        item3