用Python从字符串中剥离HTML

2024-04-25 12:07:16 发布

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

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.com">some text</a>',它将只打印“一些文本”,“打印”hello“等。如何着手这样做?


Tags: infrombrimportbrowserhttpforresponse
3条回答

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

关于Python 2

from HTMLParser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def get_data(self):
        return ''.join(self.fed)

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

对于Python 3

from html.parser import HTMLParser

class MLStripper(HTMLParser):
    def __init__(self):
        self.reset()
        self.strict = False
        self.convert_charrefs= True
        self.fed = []
    def handle_data(self, d):
        self.fed.append(d)
    def get_data(self):
        return ''.join(self.fed)

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

注意:这只适用于3.1。对于3.2或更高版本,需要调用父类的init函数。见Using HTMLParser in Python 3.2

为什么你们都这么辛苦? 您可以使用BeautifulSoupget_text()功能。

from bs4 import BeautifulSoup

html_str = '''
<td><a href="http://www.fakewebsite.com">Please can you strip me?</a>
<br/><a href="http://www.fakewebsite.com">I am waiting....</a>
</td>
'''
soup = BeautifulSoup(html_str)

print(soup.get_text()) 
#or via attribute of Soup Object: print(soup.text)

我还没想太多它会错过的情况,但你可以做一个简单的正则表达式:

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

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

如果非标记<出现在html中(例如2 < 3),那么它应该作为转义序列&...写入,因此^<可能是不必要的。

相关问题 更多 >