识别列表中的第一个和最后一个项目

我需要将一些文本文件转换为HTML代码。 我坚持将列表转换为HTML无序列表。 示例源:

文档中的一些文本
*第1项
*第2项
*第3项
一些其他的文字

输出应该是:

some text in the document
<ul>
    <li>item 1</li>
    <li>item 2</li>
    <li>item 3</li>
</ul>
some other text

目前,我有这样的:

r = re.compile(r'*(.*)n')
r.sub('<li>1</li>', the_text_document)

这会创建一个没有< ul >标签的HTML列表。
我如何识别第一个和最后一个项目并用< ul >标签包围它们?


或使用BeautifulSoup

http://www.crummy.com/software/BeautifulSoup/bs4/doc/

编辑

我显然必须给你一些关于如何阅读文档的提示。

  • 打开链接
  • 左边有一个大菜单(蓝绿色)
  • 如果仔细观察,您会发现文档分为多个部分
  • 东西
  • 在树中导航
  • 搜索树
  • 修改树(明白了)
  • 输出(懂了!)
  • 还有更多的东西

    Beautiful Soup是一个用于从HTML和XML文件中提取数据的Python库。 它与您最喜爱的解析器一起工作,提供导航,搜索和修改解析树的惯用方式。 它通常可以节省程序员数小时或数天的工作时间

    不要在第一句话后停止阅读......最后一句话非常重要,中间是什么。

    换句话说,你可以创建一个空文档...让我们说:

    soup = BeautifulSoup("<div></div>")
    document = soup.div
    

    然后你阅读你的每一行文字......然后在你有文字的时候这样做。

    document.append(line)
    

    如果行以`*``开头

    ul = document.new_tag('ul')
    document.append(ul)
    document = ul
    

    然后按全部li对文档......一旦你最终读数* ,刚刚流行父因此文档回来到div。 并继续这样做......你甚至可以递归地将ul插入到ul

    一旦你分析了一切...你可以做

    str(document)
    

    要么

    document.prettify()
    

    编辑

    只是意识到你不是在编辑html,而是一个未格式化的文本..你可以尝试使用markdown。

    http://daringfireball.net/projects/markdown/


    您可以逐行处理您的数据..下面的这个快速和肮脏的解决方案可能会被整理,但是对于您的数据来说它确实有效。

    with open('data.txt') as inf:
        star_count = 0
        for line in inf:
            line = line.strip()
    
            if not line.startswith('*'):
                if star_count == 1:
                    print'</ul>'
                print line
            else:
                if star_count == 0:
                    print '<ul>'
                    star_count = 1
                print '  <li>%s</li>'  %line.split('*')[1].strip()
    

    收益率:

    some text in the document
    <ul>
      <li>item 1</li>
      <li>item 2</li>
      <li>item 3</li>
    </ul>
    some other text
    

    根据你的数据有多复杂,或者你有重复未编号列表等,这将需要修改,你可能想要寻找一个更通用的解决方案,或修改这个起始代码来满足你的需求,只有你可以决定。

    更新

    编辑<li> .. </li>打印行以摆脱先前遗留的*


    玩过一些想法之后,我决定用第二个正则表达式。 所以基本上,在运行第一个正则表达式(来自我的原始文章,创建<li>标记)之后,我运行:

    r = re.compile(r'(<li>.*?</li>n(?!s*<li>))', re.DOTALL)
    r.sub('<ul>1</ul>', string_with_li_tags)
    

    这将找到<li>标记的第一个匹配项和</li>n组合的最后一个匹配项,后面跟着一个<li>标记(实际上意味着整个列表)并添加<ul>标记。

    编辑:我修改了正则表达式,所以它不会贪婪。 这样它可以处理同一文档中的多个列表。 只有要求是列表项之间没有空格,就像下面提到的@Aprillion一样

    编辑2:修改了负向视图以处理列表项之间的空间,因此所有情况都被覆盖

    链接地址: http://www.djcxy.com/p/10961.html

    上一篇: Identifying the first and last items in a list

    下一篇: a funny case for mysql query " like 'xx' "