将HTML列表(<li>)转换为制表符(即缩进)

2024-09-27 02:24:22 发布

您现在位置:Python中文网/ 问答频道 /正文

曾使用过几十种语言,但对Python不熟悉。在

我在这里的第一个(也许是第二个)问题,所以请温柔。。。在

试图有效地将类似HTML的标记文本转换为wiki格式(特别是将linuxtomboy/GNote notes转换为Zim)却陷入了转换列表的困境。在

对于像这样的两级无序列表。。。在

  • 第一级
    • 第二层次

假小子/侏儒用的是。。。在

<list><list-item>First level<list><list-item>Second level</list-item></list></list-item></list>

然而,Zim个人维基希望这是。。。在

* First level
  * Second level

。。。带前导标签。在

我已经研究了regex模块函数re.sub公司(), 重新匹配(), 搜索(),等等,并且发现了Python很酷的能力,可以将重复的文本编码为。。。在

^{pr2}$

因此,看起来应该有一种方法来做像。。。在

 newnote = re.sub("<list>", LEVEL * "\t", oldnote)

其中LEVEL是注释中<list>的序数(发生次数)。因此,它将是0对于第一个<list>,对于第二个1,等等

然后,每次遇到</list>时,级别都会降低。在

<list-item>标记被转换为项目符号的星号(前面适当加上换行符),并删除</list-item>标记。在

最后。。。问题是。。。在

  • 如何获得LEVEL的值并将其用作制表符乘数?在

Tags: 标记文本re语言列表html格式wiki
2条回答

您确实应该使用xml解析器来完成此操作,但要回答您的问题:

import re

def next_tag(s, tag):
    i = -1
    while True:
        try:
            i = s.index(tag, i+1)
        except ValueError:
            return
        yield i

a = "<list><list-item>First level<list><list-item>Second level</list-item></list></list-item></list>"

a = a.replace("<list-item>", "* ")

for LEVEL, ind in enumerate(next_tag(a, "<list>")):
    a = re.sub("<list>", "\n" + LEVEL * "\t", a, 1)

a = a.replace("</list-item>", "")
a = a.replace("</list>", "")

print a

这对您的示例有效,仅适用于您的示例。使用XML解析器。您可以使用xml.dom.minidom(它包含在Python中(至少2.7),无需下载任何内容):

^{pr2}$

输出:

* First level
    * Second level
    * Second level 2
        * Third level

使用Beautifulsoup,它允许您迭代标记,即使它们是自定义的。做这种手术很实用

from BeautifulSoup import BeautifulSoup
tags = "<list><list-item>First level<list><list-item>Second level</list-item></list></list-item></list>"
soup = BeautifulSoup(tags)
print [[ item.text for item in list_tag('list-item')]  for list_tag in soup('list')]

Output : [[u'First level'], [u'Second level']]

我使用了嵌套列表理解,但您可以使用嵌套for循环

^{pr2}$

我希望这对你有帮助。在

在我的示例中,我使用了beautifulsoup3,但该示例应该与BeautifulSoup4一起工作,但仅限于导入更改。在

from bs4 import BeautifulSoup

相关问题 更多 >

    热门问题