0

例如,我有一串 HTML 有序列表。在该有序列表中,我想写 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>

4

3 回答 3

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。请注意,您也可以使用''.join(html_lists),换行符只是为了使其在html显示时更具可读性。

于 2013-08-18T15:54:39.557 回答
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>
于 2013-08-18T16:27:44.430 回答
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>
于 2013-08-18T17:33:51.840 回答