8

我需要将一些文本文件转换为 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 >标签包围它们?

4

3 回答 3

1

您可以逐行处理您的数据.. 下面这个快速而肮脏的解决方案可能会被整理,但对于您的数据来说,它可以解决问题。

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>打印线以摆脱*以前留下的。

于 2012-07-08T14:44:58.930 回答
1

或使用 BeautifulSoup

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

编辑

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

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

还有更多的东西

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

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

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

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

然后你阅读你的每一行文字..然后只要你有文字就这样做。

document.append(line)

如果该行以 `*` 开头

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

然后推送li文档上的所有内容...一旦您最终阅读*,只需弹出父级,以便文档返回到 div。并继续这样做......你甚至可以递归地插入ululs.

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

str(document)

或者

document.prettify()

编辑

刚刚意识到您不是在编辑html,而是在编辑未格式化的文本。然后您可以尝试使用markdown。

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

于 2012-07-08T14:48:45.713 回答
1

在尝试了一些想法之后,我决定使用第二个正则表达式。所以基本上,在运行第一个正则表达式(来自我的原始帖子,创建<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:修改了负前瞻以处理列表项之间的空格,因此涵盖了所有情况

于 2012-07-08T17:16:52.997 回答