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

时间:2010-01-29 23:22:11

标签: python html regex tags

我正在尝试查看一个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 个答案:

答案 0 :(得分:14)

使用BeautifulSoup。使用lxml。不要使用regular expressions来解析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。只需使用请求!

答案 1 :(得分:-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)