从 Python 中的字符串中去除 HTML

新手上路,请多包涵
from mechanize import Browser
br = Browser()
br.open('http://somewebpage')
html = br.response().readlines()
for line in html:
  print line

在 HTML 文件中打印一行时,我试图找到一种只显示每个 HTML 元素的内容而不是格式本身的方法。如果它找到 '<a href="whatever.example">some text</a>' ,它只会打印“一些文本”, '<b>hello</b>' 打印“你好”等。一个人会怎么做呢?

原文由 directedition 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 677
2 个回答

我总是使用这个函数来去除 HTML 标签,因为它只需要 Python 标准库:

对于 Python 3:

 from io import StringIO
from html.parser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        super().__init__()
        self.reset()
        self.strict = False
        self.convert_charrefs= True
        self.text = StringIO()
    def handle_data(self, d):
        self.text.write(d)
    def get_data(self):
        return self.text.getvalue()

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()

对于 Python 2:

 from HTMLParser import HTMLParser
from StringIO import StringIO

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.text = StringIO()
    def handle_data(self, d):
        self.text.write(d)
    def get_data(self):
        return self.text.getvalue()

def strip_tags(html):
    s = MLStripper()
    s.feed(html)
    return s.get_data()

原文由 Eloff 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您需要剥离 HTML 标签来进行文本处理,一个简单的正则表达式就可以了。 如果您希望清理用户生成的 HTML 以防止 XSS 攻击,请不要使用它。这不是删除所有 <script> 标签或跟踪 <img> 的安全方法。 以下正则表达式将相当可靠地去除大多数 HTML 标签:

 import re

re.sub('<[^<]+?>', '', text)

对于那些不理解正则表达式的人,此搜索字符串 <...> ,其中内部内容由一个或多个( + )字符组成,不是 <? 意味着它将匹配它能找到的最小字符串。例如,给定 <p>Hello</p> </p> ? 匹配 <'p> 没有它,它将匹配整个字符串 <..Hello..>

If non-tag < appears in html (eg. 2 < 3 ), it should be written as an escape sequence &... anyway so the ^< 可能是不必要的。

原文由 mmmdreg 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题