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

news/2024/7/7 20:31:41

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

例如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();
           
        }

 

 


http://lihuaxi.xjx100.cn/news/273420.html

相关文章

高精度地图量产难,四维图新利用优势准备实现突破

传统地图只需要做到米级精度即可实现GPS导航&#xff0c;但是高精地图需要达到厘米精度才能保证无人车行驶安全。 高精地图是无人驾驶的核心技术之一。对于L2-L3级别的自动驾驶汽车&#xff0c;高精地图不必然需要。但是对于高级别的无人驾驶汽车&#xff0c;精准的地图对无人…

经验 | 秋招总结(拼多多,腾讯,百度,字节)

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达本文转自|计算机视觉联盟 offer情况秋招运气好拿到了几个offer&#xff1a; 拼多多sp 腾讯sp 百度sp 字节(面完等offer中) 其他厂我基本都拒绝面试了&#xff0c;总体看秋…

“数学不好,干啥都不行!”骨灰级程序员:其实你们都是瞎努力

之前有很多程序员读者向我们抱怨&#xff1a;1&#xff09;做算法优化时&#xff0c;只能现搬书里的算法&#xff0c;遇到不一样的问题&#xff0c;就不会了。2&#xff09;面试一旦涉及到算法和数据结构&#xff0c;如果数学不行&#xff0c;面试基本就凉凉了。3&#xff09;一…

Spring Boot 2.3.0 新特性:优雅停机!

点击上方“方志朋”&#xff0c;选择“设为星标”回复”666“获取新整理的面试文章前言&#xff1a;关于Spring Boot、Spring Cloud应用的优雅停机&#xff0c;平时经常会被问到&#xff0c;这也是实际应用过程中&#xff0c;必须要掌握的点&#xff0c;这里简单总结下以前我们…

为什么要学习Python编程语言?哪些人适合学习Python?

先回答第一个被初学编程的朋友问到最多的问题&#xff0c;为什么要学习Python编程语言&#xff1f; 答&#xff1a;现在信息更新的非常快速&#xff0c;又迎来了大数据的时代&#xff0c; 各行各业如果不与时俱进&#xff0c;都将面临优胜劣汰&#xff0c;知识是不断的更新的&…

.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…

预产期计算器在线计算生男生女计算机,预产期计算器生男生女的四种算法

预产期计算器生男生女可以提前算出宝宝是男孩还是女孩&#xff0c;那么预测生男生女计算公式是怎么样的&#xff1f;计算的方法有下面的四种。有想要早点了解宝宝是男是女的准妈妈们就用生男生女计算器来算一下吧。1、 口诀计算法68怀孕的农历月份–怀孕时母亲的虚龄&#xff0…

从网络上获取一张图片简单的

告诉ScrollView缩放的视图&#xff0c;要设置scrollView的代理。 转载于:https://www.cnblogs.com/x1024598115/p/4182674.html