随意观看


工具准备

  • python3.6
  • 正则表达式(别的语言思路一样,容易借鉴)

python正则表达式:flags的应用

这里主要介绍一下re.compile(pattern[, flags])里面的flags用法

标识符 作用
re.I 忽略大小写
re.L 表示特殊字符集 \w, \W, \b, \B, \s, \S 依赖于当前环境
re.M 多行模式
re.S ' . '并且包括换行符在内的任意字符(注意:' . '不包括换行符)
re.U 表示特殊字符集 \w, \W, \b, \B, \d, \D, \s, \S 依赖于 Unicode 字符属性数据库

特别强调re.Ire.S的用法

  1. 众所周知,html标签是大小写不敏感的,所以我们需要re.I
  2. 其次html中<style>..</style><sript>..</scipt>等一些标签里面是包含换行符的。而我们为了保留原来文本的特点包括换行符,所以需要re.S.可以匹配换行符

清洗全角和半角字符

实现字符的清洗工作,否则,jieba词库会将全角数字全部分开。而且,清洗后的半角文本更适合观看

小姿势

中文文字永远是全角,只有英文字母、数字键、符号键才有全角半角的概念,一个字母或数字占一个汉字的位置叫全角,占半个汉字的位置叫半角

全角半角转换说明

  1. 全角字符unicode编码从65281~65374 (十六进制 0xFF01 ~ 0xFF5E)
  2. 半角字符unicode编码从33~126 (十六进制 0x21~ 0x7E)
  3. 空格比较特殊,全角为 12288(0x3000),半角为 32(0x20)

代码实现

def Q2B(_char):#全角转半角
if 65281<=ord(_char)<=65374:
_char = chr(ord(_char)-65248)
elif ord(_char)==12288:
_char = chr(32)
return _char def isQ(Char):
return True if (65281<=ord(Char)<=65374 or ord(Char)==12288) else False def B2Q(_char):#半角转全角
if 33<=ord(_char)<=126:
_char = chr(ord(_char)+65248)
elif ord(_char)==32:
_char = chr(12288)
return _char def isB(Char):
return True if (33<=ord(Char)<=126 or ord(Char)==32) else False

网页字符实体

标准的html代码中的文本内容是不会出现'<'/' '等这些字符的。现在很多工具都会将网页文本内容处理成标准形式再发布。我们这里讨论的就是标准的html代码及文本内容

html字符实体查询地址

为了方便讨论,我们这里取了几个常用的作为示范,并且构造以下dict

html_char = {}
html_char['&quot;'] = html_char['"']='"'
html_char['&apos;'] = html_char['''] = "'"
html_char['&amp;'] = html_char['&'] = '&'
html_char['&lt;'] = html_char['<'] = '<'
html_char['&gt;'] = html_char['>'] = '>'
html_char['&nbsp;'] = html_char[' ']= ' '

Code实现

难点重点就在这里,做了很多准备工作,幸好python比较方便,其他语言的玩家可以借鉴一下思路

正则Code实现去标签[1]

    ...
#CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:
cdata_rule = re.compile(r'<![CDATA[.*]]>',re.I | re.S) #去除脚本(随时会出现)
script_rule = re.compile(r'<script.*?</script>',re.I | re.S) #取出<head>..</head>和中间的内容,style也在里面,不需要再写了
head_rule = re.compile(r'<head.*?/head>',re.I | re.S) #为了以防一些文本不是全部截取html代码,还是写一下以防万一
style_rule = re.compile(r'<style.*?/style>',re.I | re.S) #处理注释
comment_rule = re.compile(r'<!.*?>',re.I | re.S) #处理换行
br_rule = re.compile(r'<br\s*?/{0,1}>',re.I) #html标签
html_rule = re.compile(r'<.*?/{0,1}>',re.I)
...

正则Code实现去字符实体

    ...
global html_char
letter_char = re.compile(r'&[a-z]+;',re.I)
for char in letter_char.findall(raw):
raw = re.sub(char,html_char[char],raw) number_char = re.compile(r'&#\d+;',re.I)
for char in number_char.findall(raw):
raw = re.sub(char,html_char[char],raw)
...

全部代码(含测试文本)

import re

html_char = {}
html_char['&quot;'] = html_char['"']='"'
html_char['&apos;'] = html_char['''] = "'"
html_char['&amp;'] = html_char['&'] = '&'
html_char['&lt;'] = html_char['<'] = '<'
html_char['&gt;'] = html_char['>'] = '>'
html_char['&nbsp;'] = html_char[' ']= ' ' def Q2B(_char):#全角转半角
if 65281<=ord(_char)<=65374:
_char = chr(ord(_char)-65248)
elif ord(_char)==12288:
_char = chr(32)
return _char def isQ(Char):
return True if (65281<=ord(Char)<=65374 or ord(Char)==12288) else False def B2Q(_char):#半角转全角
if 33<=ord(_char)<=126:
_char = chr(ord(_char)+65248)
elif ord(_char)==32:
_char = chr(12288)
return _char def isB(Char):
return True if (33<=ord(Char)<=126 or ord(Char)==32) else False #定义一个装饰器,可有可无
def log(clean_html):
def info(*args, **kw):
print("The text after processing:")
return clean_html(*args, **kw)
return info @log
def clean_html(html_str,special_char=None,to_char=None): #这里留个接口,处理特殊字符串
if special_char:
special_rule = re.compile('|'.join(set(special_char)))
if not to_char:
to_char = '' #CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:
cdata_rule = re.compile(r'<![CDATA[.*]]>',re.I | re.S) #去除脚本(随时会出现)
script_rule = re.compile(r'<script.*?</script>',re.I | re.S) #取出<head>..</head>和中间的内容,style也在里面,不需要再写了
head_rule = re.compile(r'<head.*?/head>',re.I | re.S) #为了以防一些文本不是全部截取html代码,还是写一下以防万一
style_rule = re.compile(r'<style.*?/style>',re.I | re.S) #处理注释
comment_rule = re.compile(r'<!.*?>',re.I | re.S) #处理换行
br_rule = re.compile(r'<br\s*?/{0,1}>',re.I) #html标签
html_rule = re.compile(r'<.*?/{0,1}>',re.I) if special_char:
raw = special_rule.sub(to_char,html_str)
else:
raw = html_str raw = cdata_rule.sub('',raw)
raw = script_rule.sub('',raw)
raw = head_rule.sub('',raw)
raw = style_rule.sub('',raw)
raw = comment_rule.sub('',raw)
raw = br_rule.sub('\n',raw)
raw = html_rule.sub('',raw) global html_char
letter_char = re.compile(r'&[a-z]+;',re.I)
for char in letter_char.findall(raw):
raw = re.sub(char,html_char[char],raw) number_char = re.compile(r'&#\d+;',re.I)
for char in number_char.findall(raw):
raw = re.sub(char,html_char[char],raw) raw_list = list(raw)
for i in range(len(raw_list)):
if isQ(raw_list[i]):
raw_list[i] = Q2B(raw_list[i])
raw = ''.join(raw_list) return raw def test():
test_html = """ <div id="sidebar"> <div id="tools">
<h5 id="tools_example"><a href="/example/xmle_examples.asp">&nbsp;XML 实例,特殊字符:15(处理之后应该没有了)</a></h5>
<h5 id="tools_quiz"><a href="/xml/xml_quiz.asp"><XML 测验&gt;</a></h5>
<h3>'vevev'</h3>
</div> <div id="ad">
<script type="text/javascript"><!--
google_ad_client = "ca-pub-3381531532877742";
/* sidebar-160x600 */
google_ad_slot = "3772569310";
google_ad_width = 160;
google_ad_height = 600;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</div> </div>
""" print(clean_html(test_html,'】15')) if __name__=='__main__':
test()

进一步

其他脚本引用

在python的其他程序中,可以直接from clean_html import clean_html进行方便的调用(假设这个脚本名字为clean_html.py)

完善

  1. 补充字符实体(可以用爬虫爬下来,有空弄一下)
  2. html标签可能因为前端框架不同而有所差异(虽然不大)。但是都有规律,如<Vue>..</Vue>等,有规律,正则表达式就容易构建了

  1. 代码备注以标明作用 ↩︎

自己动手实现html去标签和文本提取的更多相关文章

  1. 用Ueditor存入数据库带HTML标签的文本,从数据库取出来后,anjular用ng-bind-html处理带HTML标签的文本

    ng.module('index-filters', []) .filter('trustHtml', function ($sce) { return function (input) { retu ...

  2. pre标签内文本自动换行

    pre标签内文本自动换行 给pre标签添加一个css样式 pre { white-space: pre-wrap; /* css-3 */ white-space: -moz-pre-wrap; /* ...

  3. jQuery-对标签元素 文本操作-属性操作-文档的操作

    一.对标签元素文本操作 1.1 对标签中内容的操作 // js var div1 = document.getElementById("div1"); div1.innerText ...

  4. [Swift通天遁地]二、表格表单-(11)创建星期选项表单和拥有浮动标签的文本框

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. 实验一 HTML基本标签及文本处理

    实验一 HTML基本标签及文本处理 [实验目的] 1.掌握利用因特网进行信息游览.搜索,下载网页.图片.文字和文件: 2.对给定的网站,能指出网站的链接结构.目录结构.页面布局方式: 3.掌握HTML ...

  6. R语言与医学统计图形-【16】ggplot2几何对象之标签与文本

    ggplot2绘图系统--添加标签与文本.数学表达式.条形图文本.注释 1. 文本与标签添加 geom_label的文本将以标签形式出现,即文本会带有一个背景色. geom_text则是纯文本形式展示 ...

  7. POI教程之第二讲:创建一个时间格式的单元格,处理不同内容格式的单元格,遍历工作簿的行和列并获取单元格内容,文本提取

    第二讲 1.创建一个时间格式的单元格 Workbook wb=new HSSFWorkbook(); // 定义一个新的工作簿 Sheet sheet=wb.createSheet("第一个 ...

  8. R+OCR︱借助tesseract包实现图片文本提取功能

    2016年11月,Jeroen Ooms在CRAN发布了tesseract包,实现了R语言对简单图片的文本提取.分析功能. 利用开源OCR引擎进行图片处理,目前可以识别超过100种语言,R语言可以借助 ...

  9. lucene索引查看工具luke和文本提取工具Tika

    luke可以方便的查看lucene的索引信息,当然也可以查看solr和es中的索引信息(基于lucene实现). 查看索引前,要注意lucene版本的问题,高版本的lucene用低版本的luke工具就 ...

随机推荐

  1. SQL Server数据库的存储过程中定义的临时表,真的有必要显式删除临时表(drop table #tableName)吗?

    本文出处:http://www.cnblogs.com/wy123/p/6704619.html 问题背景 在写SQL Server存储过程中,如果存储过程中定义了临时表,有些人习惯在存储过程结束的时 ...

  2. okHttp基础用法

    获取okHttp..jar.包 1.联网获取jar包 2.本地添加 okHttp的使用 get请求 1.创建okHttpClient对象new OkHttpClient(); 2.创建一个请求对象Re ...

  3. 现代3D图形编程学习--opengl使用不同的缓存对象(译者添加)

    现代3D图形编程学习系列翻译地址 http://www.cnblogs.com/grass-and-moon/category/920962.html opengl使用不同的缓存对象 在设置颜色一章中 ...

  4. 原生态JS实现banner图的常用所有功能

    虽然,用jQuery实现banner图的各种效果十分简单快捷,但是我今天用css+js代码实现了几个banner图的常用功能,效果还不错. 此次,主要想实现以下功能: 1. banner图循环不间断切 ...

  5. php7 redis扩展编译安装

    提示:php7版本不支持redis2点几的扩展 上正文: wget -c https://github.com/phpredis/phpredis/archive/php7.zip unzip php ...

  6. java复习(9)---数据库JDBC

    java写工程当然需要连接数据库.JDBC技术是连接数据库和应用程序的纽带,本节主要说明如何连接数据库. java中提供sql类. package re09; import java.sql.*; p ...

  7. Unity C# 多态 委托 事件 匿名委托 Lambda表达式 观察者模式 .NET 框架中的委托和事件

    一.多态 里氏替换原则: 任何能用基类的地方,可以用子类代替,反过来不行.子类能够在基类的基础上增加新的行为.面向对象设计的基本原则之一. 开放封闭原则: 对扩展开放,意味着有新的需求或变化时,可以对 ...

  8. HDU 5008 求第k小子串

    本题要求第k小的distinct子串,可以根据height数组,二分出这个第k小子串所在后缀的位置信息.由于题目要求子串起始下标尽可能小.所以再在rank数组中,二分出与当前后缀LCP大于等于所求子串 ...

  9. JQuery插件之Animate.css和 jquery-aniview

    Animate.css 一款强大的预设css3动画库 简介 animate.css 是一个来自国外的 CSS3 动画库,它预设了抖动(shake).闪烁(flash).弹跳(bounce).翻转(fl ...

  10. 基于AngularJS的过滤与排序【转载】

    程序设计分析 首先,如果要是先查询过滤,就要使用到AngularJS中的 过滤器filter 了. 直接在表达式的后面使用管道命令符 | ,按照下面的写法就可以达到一个过滤的效果: {{ person ...