识别列表中的第一个和最后一个项目
我需要将一些文本文件转换为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