在python中使用正则表达式从文本中删除html标签

Posted

技术标签:

【中文标题】在python中使用正则表达式从文本中删除html标签【英文标题】:Removing html tags from a text using Regular Expression in python 【发布时间】:2011-01-11 01:51:57 【问题描述】:

我正在尝试查看一个 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=".. ..”标签。谁能解释我需要在我的正则表达式中更改什么?

【问题讨论】:

用正则表达式解析 HTML 的问题,你说?为什么,我简直不敢相信!谁曾想到!书籍的出现真是太棒了! PS。美丽汤。 保持冷静,波宾斯。慢慢地向纸袋里呼吸。进出进出……***.com/questions/1732348/… 我喜欢这些问题出现的规律性。就像新问题表的“查找类似问题”部分不起作用:D 如果您花一点时间在 SO 上,您会发现解析 HTML 的更好方法大约有数十亿种,而正则表达式不是其中之一。 是的,如果您正在处理您完全了解其格式的宇宙中极小的 HTML 文档子集。 【参考方案1】:

使用BeautifulSoup。使用lxml。不要使用regular expressions 解析HTML。


编辑 2010-01-29:这将是 lxml 的合理起点:

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

url = "https://***.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。只需使用请求!

【讨论】:

-1。 OP的要求很简单,删除所有标签。不需要 BeautifulSoup。 以下是 OP 可能认为显而易见但从问题中省略的几件事:文档部分(头部和正文?仅正文?)和 javascript(OP 是否将 javascript 视为内容的一部分?) .这些将很容易通过 BeautifulSoup 和 lxml 进行控制。正则表达式根本不会处理这些。【参考方案2】:
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)

【讨论】:

我相信这将处理所有 HTML 实体:'&(([a-z]1,5)|(#\d1,4));'

以上是关于在python中使用正则表达式从文本中删除html标签的主要内容,如果未能解决你的问题,请参考以下文章

在Python 3中遇到了正则表达式子函数的问题

使用python,从字符串中删除HTML标签/格式[重复]

接口自动化(Python)-利用正则表达式从返回的HTML文本中截取自己想要的值

从 HTML 中提取文本的正则表达式

如何避免使用 Python re 库删除文本文件中正则表达式标志之间的文本块?

Python基础 :正则表达式