Python:正则表达式,用于在html中的任意两个标记之间提取文本

时间:2015-11-03 11:03:18

标签: python html regex

我尝试在HTML文件上使用"<.+>\s*(.*?)\s*<\/?.+>"。以下是我使用的Python代码

import re

def recursiveExtractor(content):
    re1='(<.+>\s*(.+?)\s*<\/?.+>)'
    m = re.findall(re1,content)
    if m:
        for (id,item) in enumerate(m):
            text=m[id][1]
            if text:print text,"\n"

f = """
<div class='a'>
      <div class='b'>
        <div class='c'>
            <button>text1</button>
            <div class='d'>text2</div>
        </div>
      </div>
    </div>
"""
recursiveExtractor(f)

但它会跳过一些文本,因为HTML是嵌套的,正则表达式从匹配部分的末尾重新开始搜索。

对于上述输入, 输出是

<div class='b'>

<div class='d'>text2</div>

</div>

但预期的输出是:

text1

text2

编辑: 我读到HTML不是常规语言,因此无法解析。根据我的理解,不可能解析。*(即使用相同的结束标记)。 但我需要的是任何标签之间的文本,例如text1 text2 text3所以我可以使用&#34; text1&#34;,&#34; text2&#34;,&#34; text3&#34;

1 个答案:

答案 0 :(得分:5)

为什么不这样做:

import re

f = """
<div class='a'>
      <div class='b'>
        <div class='c'>
            <button>text1</button>
            <div class='d'>text2</div>
        </div>
      </div>
    </div>
"""
x = re.sub('<[^>]*>', '', f)  # you can also use re.sub('<[A-Za-z\/][^>]*>', '', f)

print '\n'.join(x.split())

这将有以下输出:

text1
text2