使用正则表达式在Python中去除文本中的HTML标签

6 投票
2 回答
6438 浏览
提问于 2025-04-15 18:39

我正在尝试查看一个HTML文件,并把里面的所有标签去掉,只留下文本,但我在使用正则表达式时遇到了问题。这是我目前的代码。

import urllib.request, re
def test(url):
html = str(urllib.request.urlopen(url).read())
print(re.findall('<[\w\/\.\w]*>',html))

这个HTML文件是一个简单的页面,里面有一些链接和文本,但我的正则表达式没有办法匹配到 !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 和 'a href="...." 这些标签。有人能告诉我我需要在正则表达式中做什么修改吗?

2 个回答

-1

这段代码是用来处理某些数据的。它会根据特定的条件来筛选出我们需要的信息。简单来说,就是它会检查每一条数据,看它是否符合我们的要求,如果符合,就把它放到一个新的地方,方便我们后续使用。

在编程中,这种操作很常见,通常我们会用循环来逐条检查数据,然后用条件语句来判断是否符合要求。这样做的好处是可以自动化处理大量数据,节省时间和精力。

总之,这段代码的目的是为了让我们更方便地找到想要的数据,避免手动去一个个查找。

import re
patjunk = re.compile("<.*?>|&nbsp;|&amp;",re.DOTALL|re.M)
url="http://www.yahoo.com"
def test(url,pat):
    html = urllib2.urlopen(url).read()
    return pat.sub("",html)

print test(url,patjunk)
15

使用BeautifulSoup库。使用lxml库。不要用正则表达式来解析HTML。


编辑于2010-01-29:对于lxml来说,这个是一个不错的起点:

from lxml.html import fromstring
from lxml.html.clean import Cleaner
import requests

url = "https://stackoverflow.com/questions/2165943/removing-html-tags-from-a-text-using-regular-expression-in-python"
html = requests.get(url).text

doc = fromstring(html)

tags = ['h1','h2','h3','h4','h5','h6',
       'div', 'span', 
       'img', 'area', 'map']
args = {'meta':False, 'safe_attrs_only':False, 'page_structure':False, 
       'scripts':True, 'style':True, 'links':True, 'remove_tags':tags}
cleaner = Cleaner(**args)

path = '/html/body'
body = doc.xpath(path)[0]

print cleaner.clean_html(body).text_content().encode('ascii', 'ignore')

你想要的是内容,所以你大概不想要任何的javascript或CSS。而且,你可能只想要里的内容,而不是里的HTML。可以看看lxml.html.clean,了解一下你可以轻松去掉哪些东西。比起正则表达式,这个聪明多了,对吧?

另外,要注意unicode编码的问题。你可能会遇到一些HTML无法打印的情况。


2012-11-08:从使用urllib2改为使用requests库。直接使用requests就可以了!

撰写回答