Python:我们可以在字符串中循环吗?

时间:2013-08-18 15:51:38

标签: python html

例如,我有一个HTML Ordered List字符串。在有序列表中,我想写出n个列表。如何完成将列表添加到此字符串的任务?

以下是示例代码:

    html = """
    <ol>
      <li>
        <!--Something-->
      </li>
      ... <!--n lists-->
      {}                   #str().format()
      <li>
        <!--Something-->
      </li>
    </ol>
    """
    for li in html_lists: #where li is <li>...</li> and is inside the python list.
      html.format(li)

据我所知,字符串是不可变的,.format()会在<li>添加{}。因此,这不适用于多个<li>

3 个答案:

答案 0 :(得分:2)

就像你说的那样,字符串是不可变的,所以在一行上只有html.format(li)不会做任何事情,你需要做html = html.format(li)因为第一个版本不会修改html在适当的位置,它会返回一个结果。

至于使用str.format()的循环,您应该能够使用以下内容,假设html_lists中的每个元素都是包含单个<li>条目的字符串:

html = html.format('\n'.join(html_lists))

这是有效的,因为'\n'.join(html_lists)将从您的字符串列表中构造一个字符串,然后可以将其传递给html.format(),将{}替换为html_lists中每个元素的内容{1}}。请注意,您也可以使用''.join(html_lists),新行就是为了在显示html时更具可读性。

答案 1 :(得分:0)

您可以使用lxml构建HTML:

import lxml.html as LH
import lxml.builder as builder
html_lists = 'one two three'.split()
E = builder.E
html = (
    E.ol(
        *([E.li('something')]
          + [E.li(item) for item in html_lists]
          + [E.li('else')])
        )
    )

print(LH.tostring(html, pretty_print=True))

打印

<ol>
<li>something</li>
<li>one</li>
<li>two</li>
<li>three</li>
<li>else</li>
</ol>

答案 2 :(得分:0)

Python非常适合处理文本,因此这里有一个使用它来做你想做的事的例子:

import textwrap

def indent(amt, s):
    dent = amt * ' '
    return ''.join(map(lambda i: dent+i+'\n', s.split('\n')[:-1])).rstrip()

ordered_list_html = textwrap.dedent('''\
    <ol>
    {}
    </ol>
''')

# create some test data
html_lists = [textwrap.dedent('''\
    <li>
      list #{}
    </li>
    ''').format(n) for n in xrange(5)]

print ordered_list_html.format(indent(2, ''.join(html_lists)))

输出:

<ol>
  <li>
    list #0
  </li>
  <li>
    list #1
  </li>
  <li>
    list #2
  </li>
  <li>
    list #3
  </li>
  <li>
    list #4
  </li>
</ol>