C# Html格式内容转Csv内容包括table(重点在rowspan和colspan合并),p,div元素
Html格式内容转Csv内容,包括table(重点在rowspan和colspan合并),p,div元素,table不能包含嵌套功能。
/// <summary>
/// Html格式内容转Csv内容包括table(重点在rowspan和colspan合并),p,div元素
/// </summary>
/// <param name="hrml"></param>
/// <returns></returns>
private string HtmlToCsv(string hrml)
{
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(hrml);
StringBuilder sbLines = new StringBuilder();
HtmlAgilityPack.HtmlNodeCollection tList = doc.DocumentNode.SelectNodes("//table");
if (tList != null)
{
foreach (HtmlAgilityPack.HtmlNode table in tList)
{
sbLines.AppendLine("#flag_table#,");
HtmlAgilityPack.HtmlNodeCollection rows = table.SelectNodes("//tr");
if (rows != null)
{
int colCount = ;
StringBuilder sbTable = new StringBuilder();
foreach (HtmlAgilityPack.HtmlNode td in rows[].ChildNodes.Where(m => m.OriginalName.ToLower() == "td"))
{
HtmlAgilityPack.HtmlAttribute attr = td.Attributes["colspan"];
int colspan = (attr != null) ? int.Parse(attr.Value) : ;
colCount = colCount + colspan;
}
int rowCount = rows.Count; string[][] arr = new string[rowCount][];
for (int r = ; r < rowCount; r++)
{
arr[r] = new string[colCount];
} //填充区域
for (int r = ; r < rowCount; r++)
{
HtmlAgilityPack.HtmlNode tr = rows[r];
List<HtmlAgilityPack.HtmlNode> cols = tr.ChildNodes.Where(m => m.OriginalName.ToLower() == "td").ToList(); int colspan = ;
int rowspan = ;
for (int c = ; c < cols.Count; c++)
{
HtmlAgilityPack.HtmlAttribute cAttr = cols[c].Attributes["colspan"];
colspan = (cAttr != null) ? int.Parse(cAttr.Value) : ;
HtmlAgilityPack.HtmlAttribute rAttr = cols[c].Attributes["rowspan"];
rowspan = (rAttr != null) ? int.Parse(rAttr.Value) : ;
string text = cols[c].InnerText.Replace(" ", "").Replace(",", ",").Replace("\r", "").Replace("\n", "").Trim(); if (colspan == && rowspan == )
{
continue;
} bool isFirst = true;
int rFill = r + rowspan;
for (int ri = r; ri < rFill; ri++)
{
int cFill = c + colspan;
for (int ci = c; ci < cFill; ci++)
{
if (isFirst)
{
text = (text == string.Empty) ? " " : text;
arr[ri][ci] = text;
isFirst = false;
}
else
{
arr[ri][ci] = string.Empty;
}
}
}
}
} //填充单元
for (int r = ; r < rowCount; r++)
{
HtmlAgilityPack.HtmlNode tr = rows[r];
List<HtmlAgilityPack.HtmlNode> cols = tr.ChildNodes.Where(m => m.OriginalName.ToLower() == "td").ToList();
Queue<string> queue = new Queue<string>();
for (int c = ; c < cols.Count; c++)
{
string text = cols[c].InnerText.Replace(" ", "").Replace(",", ",").Replace("\r", "").Replace("\n", "").Trim();
queue.Enqueue(text);
}
for (int c = ; c < colCount; c++)
{
if (arr[r][c] == null)
{
string text = queue.Count > ? queue.Dequeue() : string.Empty;
arr[r][c] = text;
}
else
{
if (arr[r][c] != string.Empty)
{
if (queue.Count > )
{
queue.Dequeue();
}
}
}
}
} //组装成cvs格式内容
foreach (string[] cols in arr)
{
foreach (string col in cols)
{
sbLines.Append(col + ",");
}
sbLines.AppendLine(",");
}
table.RemoveAll();
}
}
} HtmlAgilityPack.HtmlNodeCollection pList = doc.DocumentNode.SelectNodes("//p");
if (pList != null)
{
sbLines.AppendLine("#flag_text#,");
foreach (HtmlAgilityPack.HtmlNode p in pList)
{
string text = p.InnerText.Replace(" ", "").Replace(",", ",").Replace("\r", "").Replace("\n", "").Trim();
text = GetTextByHtml(text);
if (!string.IsNullOrWhiteSpace(text))
{
sbLines.Append(text + ",");
sbLines.AppendLine(",");
}
else
{
sbLines.AppendLine(",");
}
p.RemoveAll();
}
} HtmlAgilityPack.HtmlNodeCollection dList = doc.DocumentNode.SelectNodes("//div");
if (pList != null)
{
sbLines.AppendLine("#flag_text#,");
foreach (HtmlAgilityPack.HtmlNode div in pList)
{
string text = div.InnerText.Replace(" ", "").Replace(",", ",").Replace("\r", "").Replace("\n", "").Trim();
text = GetTextByHtml(text);
if (!string.IsNullOrWhiteSpace(text))
{
sbLines.Append(text + ",");
sbLines.AppendLine(",");
}
else
{
sbLines.AppendLine(",");
}
//div.RemoveAll();
}
}
return sbLines.ToString();
}
html:

csv:

url:http://www.cnblogs.com/dreamman/p/5343924.html
C# Html格式内容转Csv内容包括table(重点在rowspan和colspan合并),p,div元素的更多相关文章
- html标签,格式控制标签,内容容器标签,超链接标签,图片标签,表格
打开DREAMWEAVER,新建HTML,如下图: body的属性: bgcolor 页面背景色 background 背景壁纸.图片 text 文字颜色 topmargin 上边距 leftm ...
- python如何转换word格式、读取word内容、转成html
# python如何转换word格式.读取word内容.转成html? import docx from win32com import client as wc # 首先将doc转换成docx wo ...
- 企业架构研究总结(30)——TOGAF架构内容框架之内容元模型(上)
2. 内容元模型(Content Metamodel) 在TOGAF的眼中,企业架构是以一系列架构构建块为基础的,并将目录.矩阵和图形作为其具体展现方式.如果我们把这些表述方式看作为构建块的语法,那么 ...
- TOGAF架构内容框架之内容元模型(上)
TOGAF架构内容框架之内容元模型(上) 2. 内容元模型(Content Metamodel) 在TOGAF的眼中,企业架构是以一系列架构构建块为基础的,并将目录.矩阵和图形作为其具体展现方式.如果 ...
- Django之富文本(获取内容,设置内容)
富文本 1.Rich Text Format(RTF) 微软开发的跨平台文档格式,大多数的文字处理软件都能读取和保存RTF文档,其实就是可以添加样式的文档,和HTML有很多相似的地方 图示 2.tin ...
- 【C#】菜单功能,将剪贴板JSON内容或者xml内容直接粘贴为类
VS 2015菜单功能,将剪贴板JSON内容或者xml内容直接粘贴为类
- content内网,会显示内容,没有内容可地址存在就是这个情况
漏洞地址:http://note.youdao.com/memory/?url=http://www.wooyun.org(如需登录,请注册登录) 正文预览的地方会读取URL地址的<meta n ...
- 为什么当多个inline-block的div中,如果有的div没有内容而有的div有内容,有内容的会下沉?
为什么当多个inline-block的div中,如果有的div没有内容而有的div有内容,有内容的会下沉? 就像这样 两个div高度相同,第二个我写了一个1当作 有内容吧,它就下沉了... 奇怪... ...
- TOGAF架构内容框架之内容元模型(下)
TOGAF架构内容框架之内容元模型(下) 2.2 治理扩展(Governance Extensions) 治理扩展元模型内容 治理扩展部分的意图在于引入额外的,并且与支持运营治理的目标和业务服务相关的 ...
随机推荐
- QEMU KVM Libvirt手册(10): KVM的各种限制
Overcommits KVM allows for both memory and disk space overcommit. However, hard errors resulting fro ...
- ArrayList源码理解
ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Col ...
- XQuery 术语
XQuery 术语 节点 在 XQuery 中,有七种节点:元素.属性.文本.命名空间.处理指令.注释.以及文档(根)节点.XML 文档是被作为节点树来对待的.树的根被称为文档节点或者根节点. 请看下 ...
- Node.js(day3)
一.模块系统 1.什么是模块 Node.js中常用的核心模块有: http模块 fs文件系统模块 url模块 path模块 os系统模块 在使用Node.js中我们发现每个js之间是没有联系的,都是单 ...
- Kali学习笔记43:SQL盲注
前面的文章都是基于目标会返回错误信息的情况进行判断是否存在SQL注入 我们可以轻易根据数据库报错信息来猜测SQL语句和注入方式 如果程序员做得比较好,不显示错误信息,这种情况下得SQL注入称为SQL盲 ...
- linux配置jdk环境变量
首先在Linux解压后缀为.tar.gz的jdk压缩文件 解压到当前的文件夹 tar -zcvf /root/java/jdk版本编号 指令: cd 目录路径 -> 是进入该目录路径 c ...
- python—day9 函数的定义、操作使用方法、函数的分类、函数的嵌套调用
一.函数的定义 函数的四个组成部分: 函数名. 函数体. 函数返回值. 函数参数 1.概念:重复利用的工具,可以完成特定功能的代码块,函数是存放代码块的容器 2.定义: def:声明函数的关键词 函数 ...
- linux各个服务器的软件自启动
首先你需要编写一个shell脚本,也就是启动app的,当然还应该有stop的脚本 这里贴出我的,因为每个人的服务安装路劲不同,故启动不同,仅供参考.如有雷同,纯属你智障 web服务器: 应用服务器: ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- Linux~其实shell脚本也很简单
用了两个的centos之后,也想看看它的脚本,我们知道shell这个东西就像windows里的批处理,它可以将一些语句进行组合,然后统一去执行,感觉挺方便的. shell文件的组成 shell语言环境 ...