C# 正则表达式提取html中的文本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 正则表达式提取html中的文本相关的知识,希望对你有一定的参考价值。

是这样的,我想提取在一个网页的所有的html代码中提取特定的html代码中的文本。比如说下面的这个:
<h1 id="artibodyTitle" pid="1" tid="1" did="25820705" fid="1666">value</h1>

想提取到这两个标记中的value部分的具体字符串,然后赋值给string型的s1变量。
然后提取下面的这个:
<div class="blkContainerSblkCon BSHARE_POP" id="artibody">
<!-- 视频小点大播放器_正文上方显示 -->

<!-- publish_helper name='原始正文' p_id='1' t_id='1' d_id='25820705' f_id='3' -->
<p>text1</p>
<p>text2</p>
<p>text3</p>
<p>text4</p>

<p>text5</p>

<p align="right">text6</p>

<!-- publish_helper_end -->
</div>
把上面<div class="blkContainerSblkCon BSHARE_POP" id="artibody">和</div>
中间的部分取出来给string型的s2变量。
然后把<div class="blkContainerSblkCon BSHARE_POP" id="artibody">和</div>中间的,去掉<p></p>的部分,这样只有文本的部分给string型的s3变量。
分别写出三个的正则表达式和实现的具体的c#代码。
谢谢各位大神了。
先给这么多分数,答得好了再追加。谢谢了。

static void Main(string[] args)

String s = @"<Body>
<div>这里是要取出的文本A <img src=""/>这里是要取出的文本B <a href="">超链接里的文本不取出 </a>这里是要取出的文本C </div>
<body>";
Regex regex = new Regex( "(/?\\\\w+)[^>]*>([^<]*)<", RegexOptions.IgnoreCase );

MatchCollection ms = regex.Matches( s );

foreach( Match m in ms )

string tagName = m.Groups[1].Value.ToLower();
string text = m.Groups[2].Value.Trim();
if( tagName != "a" && text.Length > 0 )
Console.WriteLine( text );


结果:
这里是要取出的文本A
这里是要取出的文本B
这里是要取出的文本C
参考技术A

去找一个叫HtmlAgilityPack的组件,然后使用xpath查找节点,比使用正则容易得多了。


参考技术B 第一个问题,(?<=<h1>).*?(?=</h1>)

第二个问题,[^^]*?
第三个问题,(?<=<p>).*?(?=<p>)
其他的你参照一下吧。一楼已经说的基本差不多了。把正则换一下就行了。本回答被提问者采纳
参考技术C string s1 = new Regex("(?<=<h1 id=\"artibodyTitle\" pid=\"1\" tid=\"1\" did=\"25820705\" fid=\"1666\">).*?(?=</h1>)").Match("<h1 id=\"artibodyTitle\" pid=\"1\" tid=\"1\" did=\"25820705\" fid=\"1666\">value</h1>").Value);追问

其他两个呢。方法是一样么,其他的两个的正则怎么写呢?~

追答

string code = "\r\n\r\n\r\ntext1
\r\ntext2
\r\ntext3
\r\ntext4
\r\ntext5
\r\ntext6
\r\n\r\n";
string rc = new Regex("((:?.|\r|\n)*)").Match(code).Value;

string s2 = rc.Substring("\r\n".Length,rc.Length - "".Length - "\r\n".Length);
string s3 = new Regex("(?<=).*?(?=
)").Replace(s2,string.Empty)
########测试通过

追问

string r1 = "(?)((:?.|\r|\n)*)(?=)";
string s2 = Regex.Match(ss,r1).Groups[1].Value;
我是这样写的,但是每次执行程序都会死掉。单步调试发现是执行到第二句,string s2开始就不行了。麻烦能不能看看怎么回事,请问能留个QQ么。详细问一下。谢谢。

追答

我测试了下,发现没错,我这里的程序没有死掉啊...看看ss的值有没有与你的意思符合和Groups的数量有没有超过2...

参考技术D o

C# 正则表达式提取指定文本内的内容

直接上代码和如何使用

        /// <summary>
        /// 截取字符串中开始和结束字符串中间的字符串
        /// </summary>
        /// <param name="source">源字符串</param>
        /// <param name="startStr">开始字符串</param>
        /// <param name="endStr">结束字符串</param>
        /// <returns>中间字符串</returns>
        public string SubstringSingle(string source, string startStr, string endStr)
        
            Regex rg = new Regex("(?<=(" + startStr + "))[.\\\\s\\\\S]*?(?=(" + endStr + "))", RegexOptions.Multiline | RegexOptions.Singleline);
            return rg.Match(source).Value;
        
 
        /// <summary>
        /// (批量)截取字符串中开始和结束字符串中间的字符串
        /// </summary>
        /// <param name="source">源字符串</param>
        /// <param name="startStr">开始字符串</param>
        /// <param name="endStr">结束字符串</param>
        /// <returns>中间字符串</returns>
        public List<string> SubstringMultiple(string source, string startStr, string endStr)
        
            Regex rg = new Regex("(?<=(" + startStr + "))[.\\\\s\\\\S]*?(?=(" + endStr + "))", RegexOptions.Multiline | RegexOptions.Singleline);
            
            MatchCollection matches = rg.Matches(source);
 
            List<string> resList=new List<string>();
 
            foreach (Match item in matches)
                resList.Add(item.Value);
 
            return resList;
        

 用法如下:

string html="这里 Html 文本内容省略";
 
var text1 = regex.SubstringSingle(html, "<div id=\\"pagelet_timeline_main_column\\">", "<div id=\\"pagelet_sidebar\\"");
 
var text2 = regex.SubstringMultiple(html, "<div class=\\"_4-u2 _4-u8\\">", "<div class=\\"_1dnh\\">");


具体去自己体会吧,个人觉得很实用,这里是写成了扩展方法来调用的。

 

        /// <summary>
        /// 去除转义字符
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string RemoveEscapeChar(this string str,int re=0)
        
            if (string.IsNullOrWhiteSpace(str))
                return "";
 
            if (re == 1) //不替换特殊字符
                return str;
 
            if (re == 2)  //不移除空格
                return str.Replace("\\n", "").Replace("\\t", "").Replace("\\r", "");
 
            return str.Replace("\\n", "").Replace("\\t", "").Replace("\\r", "").Replace(" ", "").Trim();
        


上面是去除页面中转义字符,换行符的一个扩展方法,去除后再配合正则来进行筛选很实用,我个人主要用在对请求得到的html 指定内容进行提取。

2020年1月15号补充:

在使用的过程中难免会遇到一些正则表达式的特殊符号例如下面这个文本

oL[289]( x[/42.934715] y[/31.199666] z[/-0.929894] u[/-0.20919151978424] v[/-0.04218084669353] w[/0.97696452557019] )

我们要提取出  [ ]  中的内容,那么在写的时候就要加上转义了,如下代码我分别提取文本中的x,y,z,u,v,w中的值 使用 \\\\ 进行特殊符号转义

string temp_x = SubstringSingle(str, "x\\\\[/", "\\\\]");
string temp_y = SubstringSingle(str, "y\\\\[/", "\\\\]");
string temp_z = SubstringSingle(str, "z\\\\[/", "\\\\]");
string temp_u = SubstringSingle(str, "u\\\\[/", "\\\\]");
string temp_v = SubstringSingle(str, "v\\\\[/", "\\\\]");
string temp_w = SubstringSingle(str, "w\\\\[/", "\\\\]");


这些就是需要注意的地方了,所以当你在提取时候如果有正则中特殊字符记得转义哈,不然会匹配不到的哦!
————————————————
版权声明:本文为CSDN博主「Syspan」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_40729514/article/details/95986966

以上是关于C# 正则表达式提取html中的文本的主要内容,如果未能解决你的问题,请参考以下文章

需要在 C# 正则表达式中提取文本

正则表达式提取特定 HTML 标记中的纯文本 [重复]

c# 正则表达式提取()中的值

使用 XPath 和正则表达式提取 HTML 注释中的文本

C# 正则表达式提取指定文本内的内容

C# 正则表达式提取指定文本内的内容