日期:2014-05-19  浏览次数:20716 次

急,100分请求网页分析答案!!
如何提取网页中 <p> </p> , <p> <p> , <br/> <br> , <br> <br> 之间的内容,包括其中的链接样式这些都不能少!!
请用C#正则表达式,非常感谢!!

------解决方案--------------------
正则表达式只能匹配正则的HTML的。举例来说,如果在下载时网络中断,那么你会得到一个不完整的HTML字符串

<html> <head> <title> Title </title>

查找head的结束标签的正则表达式会失败。
网页作者也可能会编写不符合规范的HTML代码
<input type= "submit " name= "previewcomment " value= "preview > > ">
但是浏览器会正常显示这样的HTML。
你可以使用MSHTML.tlb(随IE发布)来使用IE的解析引擎。关于如何引用这个类型库,参考
http://support.microsoft.com/kb/922275
关于如何解析HTML,参考
http://www.codeproject.com/internet/parse_html.asp
------解决方案--------------------
不明白你这需求是什么意思,以 <p> </p> 为例吧,如果网页源文件里有多组这样的标签,是都取出还是只取一个?是从 <p> 开始,取到最后一个 </p> ,还是取到这个 <p> 后的第一个 </p>

正则用
<p> [\s\S]*? </p>
即可,其它同理
如果 <p> 有其它属性,用 <p[^> ]*> [\s\S]*? </p>
用Regex.Match或Regex.Matches方法提取

如果是已获得完整的网页源文件,可以用正则分析,否则参考jiangsheng提供资源
------解决方案--------------------
/// <summary>
/// 除去Hhtm元素Script脚本
/// 分析出文本内容
/// </summary>
/// <returns> </returns>
private void ParseText()
{
string pattern;
string txt = Content;
//清除标题
pattern = " <title> .*? </title> ";
txt = Regex.Replace(txt, pattern, " ", RegexOptions.IgnoreCase | RegexOptions.Singleline);
//清里面的Style
pattern = " <style.*?> .*? </style> ";
txt = Regex.Replace(txt, pattern, " ", RegexOptions.IgnoreCase | RegexOptions.Singleline);
//清里面的Script
pattern = " <script.*?> .*? </script> ";
txt = Regex.Replace(txt, pattern, " ", RegexOptions.IgnoreCase | RegexOptions.Singleline);
//清除双引号和单引号里面的内容
pattern = @ "(\\ ')|(\\ " ") ";
txt = Regex.Replace(txt, pattern, " ");
pattern = @ " " ".*? " " ";
txt = Regex.Replace(txt, pattern, " ");
pattern = " '.*? ' ";
txt = Regex.Replace(txt, pattern, " ");
//清里面的Html标记
pattern = " <.*?> ";
txt = Regex.Replace(txt, pattern, " ", RegexOptions.IgnoreCase | RegexOptions.Singleline);
pattern = " </[a-z][0-9a-z]*> ";
txt = Regex.Replace(txt, pattern, " ", RegexOptions.IgnoreCase | RegexOptions.Singleline);
//清所有的空格和回车等残余字符
pattern = @ " | <|> | " "| '\t|\r|\n ";
txt = Regex.Replace(txt, pattern, " ", RegexOptions.Singleline);
Text = txt;
}