【问题标题】:Python: Regular expression to extract text between any two tags in a htmlPython:正则表达式提取html中任意两个标签之间的文本
【发布时间】:2016-02-03 12:14:54
【问题描述】:

我尝试在 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 所以我对 "text1","text2","text3" 的列表很好

【问题讨论】:

  • 强制链接再次警告使用正则表达式解析 HTML:*.com/a/1732454/3923281
  • @ajcr 我不需要解析 html 结构。据我了解,无法解析
    .*
    (即具有相同的结束标签)。但我需要的是任何标签之间的文本,例如
    text1 text2 text3
    所以我对 "text1","text2","text3"
  • 嗯,好的——那么你也许可以以这种更有限的方式使用正则表达式。感谢您的澄清!

标签: python html regex


【解决方案1】:

为什么不这样做:

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

【讨论】:

  • 啊,处理它的好方法。正是我需要的,谢谢