提取html的正文
1 using System;
2 using System.Text;
3 namespace HtmlStrip
4 {
5 class MainClass
6 {
7 public static void Main (string[] args)
8 {
9 string str = "<div>abc</div><span>efg</span><br /><script>888</script><!--<PA>WW</PA-->oo";
10 //System.IO.StreamReader rd=new System.IO.StreamReader ("/home/lx/test.html");
11 //str=rd.ReadToEnd ();
12 HtmlParser t = new HtmlParser (str); //
13 t.KeepTag (new string[] { "br" }); //设置br标签不过虑
14 Console.Write (t.Text ());
15 }
16
17
18
19 }
20 class HtmlParser
21 {
22 private string[] htmlcode; //把html转为数组形式用于分析
23 private StringBuilder result = new StringBuilder (); //输出的结果
24 private int seek; //分析文本时候的指针位置
25 private string[] keepTag; //用于保存要保留的尖括号内容
26 private bool _inTag; //标记现在的指针是不是在尖括号内
27 private bool needContent = true; //是否要提取正文
28 private string tagName; //当前尖括号的名字
29 private string[] specialTag = new string[] { "script", "style", "!--" }; //特殊的尖括号内容,一般这些标签的正文是不要的
30
31 /// <summary>
32 /// 当指针进入尖括号内,就会触发这个属性。这里主要逻辑是提取尖括号里的标签名字
33 /// </summary>
34 public bool inTag {
35 get { return _inTag; }
36 set {
37 _inTag = value;
38 if (!value)
39 return;
40 bool ok = true;
41 tagName = "";
42 while (ok) {
43 string word = read ();
44 if (word != " " && word != ">") {
45 tagName += word;
46 } else if (word == " " && tagName.Length > 0) {
47 ok = false;
48 } else if (word == ">") {
49 ok = false;
50 inTag = false;
51 seek -= 1;
52 }
53 }
54 }
55 }
56 /// <summary>
57 /// 初始化类
58 /// </summary>
59 /// <param name="html">
60 /// 要分析的html代码
61 /// </param>
62 public HtmlParser (string html)
63 {
64 htmlcode = new string[html.Length];
65 for (int i = 0; i < html.Length; i++) {
66 htmlcode[i] = html[i].ToString ();
67 }
68 KeepTag (new string[] { });
69 }
70 /// <summary>
71 /// 设置要保存那些标签不要被过滤掉
72 /// </summary>
73 /// <param name="tags">
74 ///
75 /// </param>
76 public void KeepTag (string[] tags)
77 {
78 keepTag = tags;
79 }
80
81 /// <summary>
82 ///
83 /// </summary>
84 /// <returns>
85 /// 输出处理后的文本
86 /// </returns>
87 public string Text ()
88 {
89 int startTag = 0;
90 int endTag = 0;
91 while (seek < htmlcode.Length) {
92 string word = read ();
93 if (word.ToLower () == "<") {
94 startTag = seek;
95 inTag = true;
96 } else if (word.ToLower () == ">") {
97 endTag = seek;
98 inTag = false;
99 if (iskeepTag (tagName.Replace ("/", ""))) {
100 for (int i = startTag - 1; i < endTag; i++) {
101 result.Append (htmlcode[i].ToString ());
102 }http://www.huiyi8.com/clxgt/
103 } else if (tagName.StartsWith ("!--")) {
104 bool ok = true;窗帘效果图
105 while (ok) {
106 if (read () == "-") {
107 if (read () == "-") {
108 if (read () == ">") {
109 ok = false;
110 } else {
111 seek -= 1;
112 }
113 }
114 }
115 }
116 } else {
117 foreach (string str in specialTag) {
118 if (tagName == str) {
119 needContent = false;
120 break;
121 } else
122 needContent = true;
123 }
124 }
125 } else if (!inTag && needContent) {
126 result.Append (word);
127 }
128
129 }
130 return result.ToString ();
131 }
132 /// <summary>
133 /// 判断是否要保存这个标签
134 /// </summary>
135 /// <param name="tag">
136 /// A <see cref="System.String"/>
137 /// </param>
138 /// <returns>
139 /// A <see cref="System.Boolean"/>
140 /// </returns>
141 private bool iskeepTag (string tag)
142 {
143 foreach (string ta in keepTag) {
144 if (tag.ToLower () == ta.ToLower ()) {
145 return true;
146 }
147 }
148 return false;
149 }
150 private string read ()
151 {
152 return htmlcode[seek++];
153 }
154
155 }
156 }
157
提取html的正文的更多相关文章
- c# 使用正则表达式 提取章节小说正文全本篇
这一节主要内容是使用正则表达式提取网站的正文,主要面向于小说章节网站.其中涉及到一些其他知识点,比如异步读取.异步流写入等,代码中都会有详细的注解.现在流行的网络文学都是每日一更或几更,没有一个统一的 ...
- 提取HTML的正文类
本文转载:http://blog.csdn.net/cjh200102/article/details/6824895 //2.提取html的正文 类 using System; using Syst ...
- 利用正则提取discuz的正文内容
源正文: [p=24, null, left][color=#000][font=宋体]近日,香港著名漫画家马荣成在香港举办的"[color=#ff660][url=http://cul.c ...
- HTML 转文本及HTML内容提取(C#)
//1.HTML直接转文本 //使用方法 HtmlToText convert = new HtmlToText(); textBox2.Text = convert.Convert(textBox1 ...
- Java 提取Word中的文本和图片
本文将介绍通过Java来提取或读取Word文档中文本和图片的方法.这里提取文本和图片包括同时提取文档正文当中以及页眉.页脚中的的文本和图片. 使用工具:Free Spire.Doc for Java ...
- Python网页正文转换语音文件的操作方法
天气真的是越来越冷啦,有时候我们想翻看网页新闻,但是又冷的不想把手拿出来,移动鼠标翻看.这时候,是不是特别想电脑像讲故事一样,给我们念出来呢?人生苦短,我有python啊,试试用 Python 来朗读 ...
- UWP开发入门(二十三)——WebView
本篇讨论在UWP开发中使用WebView控件时常见的问题,以及一些小技巧. WebView是实际开发中常用的控件,很多大家抱怨的套网页的应用都是通过WebView来实现的.这里要澄清一个问题,套网页的 ...
- JAVA爬虫 WebCollector
JAVA爬虫 WebCollector 爬虫简介: WebCollector是一个无须配置.便于二次开发的JAVA爬虫框架(内核),它提供精简的的API,只需少量代码即可实现一个功能强大的爬虫. 爬虫 ...
- Python爬虫初学(二)—— 爬百度贴吧
Python爬虫初学(二)-- 爬百度贴吧 昨天初步接触了爬虫,实现了爬取网络段子并逐条阅读等功能,详见Python爬虫初学(一). 今天准备对百度贴吧下手了,嘿嘿.依然是跟着这个博客学习的,这次仿照 ...
随机推荐
- 51 NOD 1407 and and and and !!
首先与等于零 相当于要求 每一位 在选的数里都有至少一个在该位为 0.直接求这个不太好求,我们考虑容斥: 设F(s) 为 不合法的位的集合至少是s的方案数 ,某一位不合法当且仅当选的数在这一位都是 ...
- highcharts中放aqi及6要素,再加上气象5要素的图
var chart = Highcharts.chart('container', { chart: { zoomType: 'xy' }, title: { text: '东京月平均天气数据' }, ...
- 【Maven jar】打包单个或多个文件,有依赖jar包的将架包一起打包成一个jar包供别的项目引用
之前有一片文章,是打包单个java文件的.这次想要将http://www.cnblogs.com/sxdcgaq8080/p/8398780.html 打包成jar包,发现这个java文件中引用了多 ...
- UnicodeEncodeError: 'ascii' codec can't encode character u'\u5728' in position 1
s = "图片picture"print chardet.detect(s) for c in s.decode('utf-8'): print c UnicodeEncodeEr ...
- Java中的BigInteger在ACM中的应用
Java中的BigInteger在ACM中的应用 在ACM中的做题时,常常会遇见一些大数的问题.这是当我们用C或是C++时就会认为比較麻烦.就想有没有现有的现有的能够直接调用的BigInter,那样就 ...
- Go语言阅读小笔记,来自知呼达达关于unsafe.Pointer的分享.
第一式 - 获得Slice和String的内存数据 func stringPointer(s string) unsafe.Pointer { p := (*reflect.StringHeader) ...
- d3js 添加数据
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- 菜鸟调错(十)——启动Tomcat报错“Unsupported major.minor version xxx ”
近期项目更新JDK,由之前的1.7更新到1.8. 下载并安装好新的JDK以后,编译.启动Tomcat的时候,报错了.提示:"Unsupported major.minor version x ...
- 获取Android屏幕尺寸、控件尺寸、状态栏/通知栏高度、导航栏高度
1.获取Android屏幕尺寸 我们能够通过getSize()方法获得屏幕的尺寸 Display display = getWindowManager().getDefaultDisplay(); P ...
- Android对apk源代码的改动--反编译+源代码改动+又一次打包+签名【附HelloWorld的改动实例】
最近遇到了须要改动apk源代码的问题,于是上网查了下相关资料.编写了HelloWorld进行改动看看可行性,经过实验证明此方案可行,而且后来也成功用这种方法对目标apk进行了改动,仅仅只是须要改动的部 ...