当前位置: 首页 > 编程日记 > 正文

网页解析:如何获得网页源码中嵌套的标签。

一:前言:网页源码中有很多嵌套的标签

例如div标签嵌套如:bUTP<DIV>finally<div>aurora</div>@126.com</div><div class=\"Cited1\">ggff</div>

我们的网页解析工作中有时候需要解嵌套。通俗的讲就是把嵌套的标签以线性表的形式表示出来。还拿上面的例子来说明。即解嵌套为

<div>aurora</div>

<DIV>finally<div>aurora</div>@126.com</div>

div class=\"Cited1\">ggff</div>

核心代码如下:

ContractedBlock.gifExpandedBlockStart.gifCode
 class ThemeIRAssist
    {
        
public static void  GetNodesByTags( ref string rawtext,string tags,ref  List<string>result )
       {   
//储存开始标签的位置
           List<Position > beginTagPos = new List<Position >();
            
//储存结束标签的位置
           List<Position> endTagPos = new List<Position>();
            
//匹配开始标签的正则表达式
           string sBeginTagPattern = "<" + tags;
           Regex regexBeginTag 
= new Regex(sBeginTagPattern, RegexOptions.IgnoreCase | RegexOptions.Singleline);
           
//匹配结束标签的正则表达式。
           string sEndTagPattern = "</" + tags + ">";
           Regex regexEndTag 
= new Regex(sEndTagPattern, RegexOptions.Singleline | RegexOptions.IgnoreCase);
            
//获得开始标签的集合
           MatchCollection beginTagCollection = regexBeginTag.Matches(rawtext);
            
//获得结束标签的集合
           MatchCollection endTagCollection = regexEndTag.Matches(rawtext);
           
foreach (Match mymatch in beginTagCollection)
           {
              Position pos
=new Position();
               pos.nPos
=mymatch.Index;
               pos.VistStatus
=false;
               beginTagPos.Add(pos);
               
           }

           
foreach (Match mymatch in endTagCollection)
           {
               Position pos 
= new Position();
               pos.nPos 
= mymatch.Index;
               pos.VistStatus 
= false;
               endTagPos.Add(pos);


           }
           
for (int i = 0; i < endTagPos.Count; i++)
           {
               
for (int j = beginTagPos.Count - 1; j >= 0; j--)
               {
                   
if(endTagPos[i].nPos<beginTagPos[j].nPos)
                       
continue;
                   
else
                   {
                       
if (beginTagPos[j].VistStatus)
                           
continue;
                       
else
                       {
                           result.Add(rawtext.Substring(beginTagPos[j].nPos,endTagPos[i].nPos
-beginTagPos[j].nPos+6));
                           beginTagPos[j].VistStatus
=true;
                           
break;
                       }

                   }
               }
           }
            






 
       }
    }
    
class Position
    {
       
private int pos;
        
private bool visited;
        
public int nPos
        {
            
get { return pos; }
            
set { pos = value; }
       
        }
        
public bool VistStatus
        {
            
get { return visited; }
            
set { visited = value; }
        }

    }

Main函数测试如下:

ContractedBlock.gifExpandedBlockStart.gifCode
 static void Main(string[] args)
        {
            
            StreamReader sr 
= new StreamReader("D:\\finally.txt", Encoding.GetEncoding("utf-8"));
            
string rawtext = sr.ReadToEnd();
           
// string rawtext = "bUTP<DIV>finally<div>aurora</div>@126.com</div><div class=\"Cited1\">ggff</div>";
            List<string> result = new List<string>();
            ThemeIRAssist.GetNodesByTags(
ref rawtext, "div"ref result);
            Console.WriteLine(result.Count);
            Regex regexStadard 
= new Regex(@"^<div\s+class=""Cited1""", RegexOptions.IgnoreCase | RegexOptions.Singleline);
            
for (int i = result.Count - 1; i >= 0; i--)
            {
                
if(!regexStadard.IsMatch(result[i]))
                    result.RemoveAt(i);
            }
            Console.WriteLine(result.Count);
            
foreach(string s in result)
            {
                Console.WriteLine(
"***************************************************");
                Console.Write(s);
                Console.WriteLine(
"***************************************************");
            }
            Console.Read();
           
        }

相关文章:

36.intellij idea 如何一键清除所有断点

转自&#xff1a;https://www.cnblogs.com/austinspark-jessylu/p/7799212.html 1.在idea左下方找到"View Breakpoints"按钮,点击打开. 2.点击"Java Line Breakpoints"前方的全选框,取消全选. 3.点击上方"-"即"Remove"按钮,即可取消所…

Ruby与vim

介绍一点vim下使用Ruby的技巧。 1. vim命令行模式下输入 !ruby % 可以直接运行Ruby程序&#xff0c;并返回到vim编辑 2. vim Ruby关键字及自定义变量补全 拷贝附录中的ruby-macros.vim至机器某处&#xff0c;然后修改~/.vimrc&#xff0c;添加一行&#xff1a; source ROOT(…

NLP技术落地为何这么难?里面有哪些坑?

AI 很火&#xff0c;但是 AI 的门槛也很高&#xff0c;普通的开发者想要搭上这波 AI 红利依然困难。近期&#xff0c;人工智能公司推出了新一代智能 Bot 开放平台&#xff0c;它整合了小i机器人 Chatting Bot、FAQ Bot、Discovery Bot 三大核心能力&#xff0c;为企业和开发者提…

开源工具之valgrind

首先对源文件进行编译&#xff1a;Preparing your programCompile your program with -g to include debugging information so that Memchecks error messages include exact line numbers.-O0 a good idea if you can tolerate the slowdown-O1 line number in error message…

存储过程定义语法

CREATE PROCEDURE addTicket(in vipsql VARCHAR(255),in ordersql VARCHAR(255),in detailkey varchar(255),in detailsql VARCHAR(255)) comment 挂单&#xff08;售药窗口&#xff09; BEGIN DECLARE CONTINUE HANDLER FOR SQLEXCEPTION ,NOT FOUND rollback; start transac…

.NET : 针对Oracle的LOB数据访问

参考资料&#xff1a;来自Oracle官方网站 在 .NET 中使用 Oracle 数据库事务作者&#xff1a;Jason Price http://www.oracle.com/technology/global/cn/pub/articles/price_dbtrans_dotnet.html 在 .NET 中使用大对象作者&#xff1a;Jason Price http://www.oracle.com/techn…

MySQL数据类型--------浮点类型实战

1. 背景 * MySQL支持的浮点类型中有单精度类型(float), 双精度类型(double)&#xff0c;和高精度类型(decimal)&#xff0c;在数字货币类型中推荐使用高精度类型(decimal)来进行应用. * MySQL浮点型和定点型可以用类型名称后加&#xff08;M&#xff0c;D&#xff09;来表示&am…

山寨上网本溃败的两点教训

不是马后炮。08年11月份&#xff0c;笔者写过一篇《上网本难以复制山寨机的辉煌》&#xff08;以下简称《辉煌》&#xff09;&#xff0c;从消费取向和价格两个方面着手&#xff0c;分析认为山寨上网本市场有限&#xff0c;难以复制山寨手机的市场奇迹。现在看来&#xff0c;笔…

分享一个expect的脚本

分享一个expect的脚本&#xff0c;可以用于Linux机器之间远程执行命令&#xff1a; #!/usr/bin/expect -fset ipaddress [lindex $argv 0] set user [lindex $argv 1] set passwd [lindex $argv 2] set cmd [lindex $argv 3] set timeout [lindex $argv 4]spawn -noecho ssh $u…

今晚直播 | 深入浅出理解A3C强化学习

强化学习是一种比较传统的人工智能手段&#xff0c;在近年来随着深度学习的发展&#xff0c;强化学习和深度学习逐渐结合在了一起。这种结合使得很多原来无法想象的工作有了可能&#xff0c;最令我们瞩目的莫过于AlphaGo战胜李世石&#xff0c;以及OpenAI团队的机器人可以在团战…

正则表达式口诀及教程(推荐)

正则其实也势利&#xff0c;削尖头来把钱揣&#xff1b; &#xff08;指开始符号^和结尾符号$&#xff09;特殊符号认不了&#xff0c;弄个倒杠来引路&#xff1b; &#xff08;指\. \*等特殊符号&#xff09;倒杠后面跟小w&#xff0c; 数字字母来表示&#xff1b; &#xff0…

ssh其他机器的Expect脚本

ssh登陆其他机器的Expect脚本 #!/usr/bin/expect -fset user [lindex $argv 0] set ipaddr [lindex $argv 1] set passwd [lindex $argv 2]spawn ssh -l $user $ipaddrexpect "password:" send "$passwd\r" interact或者&#xff1a; #!/usr/bin/expect -f…

今晚8点直播 | 深入浅出理解A3C强化学习

强化学习是一种比较传统的人工智能手段&#xff0c;在近年来随着深度学习的发展&#xff0c;强化学习和深度学习逐渐结合在了一起。这种结合使得很多原来无法想象的工作有了可能&#xff0c;最令我们瞩目的莫过于AlphaGo战胜李世石&#xff0c;以及OpenAI团队的机器人可以在团战…

40.lombok在IntelliJ IDEA下的使用

转自&#xff1a;https://www.cnblogs.com/yjmyzz/p/lombok-with-intellij-idea.html lombok是一款可以精减java代码、提升开发人员生产效率的辅助工具&#xff0c;利用注解在编译期自动生成setter/getter/toString()/constructor之类的代码。代码越少&#xff0c;意味着出bug的…

C++之Boost使用

1. Get & Build & Install Boost download boost from http://www.boost.org/ 进入boost目录&#xff0c;使用命令&#xff1a; ./bootstrap.sh --prefixpath/to/installation ./b2 install 如此之后&#xff1a; leave Boost binaries in the lib/ subdirectory…

这就是芬兰:先让全国1%的人学起AI!

译者 | 大鱼责编 | 琥珀出品 | AI科技大本营【AI科技大本营导语】全球最大的手机制造商诺基亚、著名游戏《愤怒的小鸟》的开发商 Rovio&#xff0c;这两大曾名噪一时的科技公司都来自同一个国家——芬兰。很多人会问&#xff1a;在如此激烈的竞争环境下&#xff0c;为什么如此小…

Linux 裸设备基础知识(转)

1、裸设备定义&#xff1a;一块没有分区的硬盘&#xff0c;称为原始设备(RAW DEVICE)或者是一个分区&#xff0c;但是没有用EXT3,OCFS等文件系统格式化,称为原始分区(RAW PARTITION)以上两者都是裸设备 2、裸设备的绑定有文件系统的分区是采用mount的方式挂载到某一个挂载点的…

吴恩达与LG握手合作!

图片来自LG官网作者 | 琥珀出品 | AI科技大本营在近日举办的 CES 大会上&#xff0c;人工智能领域知名科学家、Landing.ai 创始人兼 CEO 吴恩达&#xff08;Andrew Ng&#xff09;与 LG&#xff08;LG Electronics&#xff09;总裁兼 CTO IP. Park 在拉斯维加斯签署了战略合作伙…

linux上安装mysql,tomcat,jdk

Linux 上安装 1 安装jdk 检测是否安装了jdk 运行 java –version若有 需要将其卸载a) 查看安装哪些jdk rmp –qa |grep java b) 先卸载openjdk 1.7 c) 在卸载openjdk 1.6 使用rpm –e - -nodeps 卸载的包 安装jdka) 上传jdk到linux 使用Xftp5…

现代人的无知什么样

以前没有知识的人就是无知&#xff01; 但现在变了&#xff01;一个博士却不会用他的知识挣钱养家糊口算不算无知&#xff0c;一个人大学毕业却不会学习算不算无知&#xff0c;一个经理在自己的电脑上找不到自己存的东西算不算无知&#xff0c;有知识却不会表达的人算不算无知…

zz Expect的安装

转载一篇靠谱的文章&#xff0c;按照文章所述方法一次成功。只不过我的expect二进制文件最后实在tcl的bin目录下&#xff0c;而不是expect的bin目录下&#xff0c;这个令我有些疑惑&#xff0c;whatever&#xff0c;不算什么大问题&#xff0c;注意一下就好了。A. Tcl 安装 主页…

分享一个ssh打通的脚本

分享一个ssh打通的脚本&#xff0c;经过测试可用。目前只能单向打通&#xff0c;且要求本地用户名为admin(写入代码&#xff0c;可简单修改)。本身只是个人使用&#xff0c;故通用性、异常情况考虑不多&#xff0c;大家可以做个参考。 补充一点&#xff0c;Important Tip&…

从云计算到AI:NetApp的数据网络转型之道

毫无疑问&#xff0c;在 AI、大数据、云计算等新技术潮流的冲击下&#xff0c;各行业企业的数字化转型进程日益加速&#xff0c;社会正在进入一个全新的数据融合时代。这一过程中&#xff0c;人们一方面对技术予以高期待&#xff0c;期望给行业进行业务重构&#xff0c;但另一方…

侧方位停车技巧

侧方位停车技巧 侧方位停车相对来说是比较容易的&#xff0c;只要掌握要领就能够正确地倒入车位中。具体要领如下&#xff1a; 第一步先打右转向灯&#xff0c;挂倒档&#xff0c;保持车辆平稳、缓慢地倒车&#xff1b;第二步回头看桩&#xff0c;当右后车门三角窗中部与1号桩&…

微信是把“杀猪刀”,还改变了我的表情包

整理 | Jane出品 | Python大本营1 月 9 日上午&#xff0c;一年一度的微信公开课 PRO 在广州举行&#xff0c;会上发布了《2018微信年度数据报告》。报告的第一部分是 2018 年微信用户活跃数、发送消息与音视频通话数据&#xff1b;第二部分根据微信用户画像&#xff0c;针对不…

中缀、前缀表达式

为什么80%的码农都做不了架构师&#xff1f;>>> 一、后缀表达式求值 后缀表达式也叫逆波兰表达式&#xff0c;其求值过程可以用到栈来辅助存储。假定待求值的后缀表达式为&#xff1a;6 5 2 3 8 * 3 *&#xff0c;则其求值过程如下&#xff1a; 1&#xf…

Linux之tee命令

语  法&#xff1a;tee [-ai][--help][--version][文件...]补充说明&#xff1a;tee指令会从标准输入设备读取数据&#xff0c;将其内容输出到标准输出设备&#xff0c;同时保存成文件。参  数&#xff1a;-a或--append  附加到既有文件的后面&#xff0c;而非覆盖它&…

在WinXP上通过Virtual PC安装WinCE

开发WinCE程序的调试&#xff0c;要么用Emulator&#xff0c;要么用触摸屏等等硬件&#xff0c;模拟器不真实&#xff0c;硬件又难找还不易随身带。象我这样穷得买不了带CE的PDA&#xff0c;懒得不想下巨型的PB、VS&#xff0c;要随时调试还真不容易。试过VMWare&#xff0c;效…

valgrind概述及错误分析

Valgrind由内核&#xff08;core&#xff09;以及基于内核的其他调试工具组成.内核类似于一个框架&#xff08;framework&#xff09;,它模拟了一个CPU环境,并提供服务给其他工具.而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。 Valgrind包…

超过C++、压制Java与C,Python拔得TIOBE年度编程语言!

作者 | 屠敏来源 | CSDN&#xff08;ID&#xff1a;CSDNNews&#xff09;如同两个月前&#xff0c;TIOBE 编程语言社区于官网预料的那般&#xff0c;2018 年的年度编程语言终将在一众老牌编程语言如 Java、C、C、Python、Visual Basic .NET 中诞生。近日&#xff0c;TIOBE 排行…