匹配html标签的正则表达式

custom1234 2012-11-14 09:00:59

<p class="t">xxxxx</p><font>xxxxxxx</font><br/><br/>
<span>xxxxxxxx</span ><br/> <br/>
<span>xxxx</span ><br/><br/>
<p class="t">xxxxx</p> - <a herf="xxxxxx.html">xxxxxxxx</a><br/><br/>
<span>xxxxxx</span ><br/><br/>
<p class="t">xxxxxx</p> - <a herf="xxxxxx.html">xxxx</a><br/><br/>
<div><p class="t">xxxxx</p></div><br/><br/>
<p class="t">xxxxxxx</p> - <a herf="xxxxx.html">xxxxxxxxxxxx</a><br/><br/>
<table><tr><td>xxxxxx</td></tr></table><br/><br/>

以上为一段测试数据。

想通过正则来抓取<p class="t">xxxxx</p> - <a herf="xxxxxx.html">xxxxxxxx</a> 这个内容。
应该说是这个整体的内容,内容数据里有<p class="t">xxxxx</p>这段,但我要的是<p class="t">xxxxx</p> - <a herf="xxxxxx.html">xxxxxxxx</a>这个整体的标签内容。也就是说每次都是抓取这段内容。其中打x的为动态内容。通过以下代码可以获取到所需内容,但连<p class="t">xxxxx</p>这段也抓取到了,因为<p class="t">xxxxx</p>这段没有与 "- <a herf="xxxxx.html">xxxxxxxxxxxx</a>" 这种类型的靠在一起,所以
被视为不需要的数据。请问如何修改以下代码的正则,让它每次抓取的都是以上给出的一个整体块内容。
"<p class="t">xxxxx</p> - <a herf="xxxxxx.html">xxxxxxxx</a>" 注意:中间横线的左右为不固定的空格或回车


string regex = "<p class=\"t\">(?<content1>.+?)</p>\\s[-]\\s<a href=(?<url>.+?)>(? <content2>.+?)</a>";

Regex reg = new Regex(regex , RegexOptions.IgnoreCase | RegexOptions.Compiled);

MatchCollection ms = reg.Matches(myHtml);

foreach (Match m in ms) { string url = m.Groups["url"].Value;

string content1 = m.Groups["content1"].Value;

string content2 = m.Groups["content2"].Value;

}


此问题贴已在http://bbs.csdn.net/topics/390280877发表过,同时也在此谢谢jordan102的热心回复,尽管没有解决,也衷心谢谢你!<br/><br/>
...全文
157 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hch126163 2012-11-15
  • 打赏
  • 举报
回复
string regex = "<p class=\"t\">(?<content1>.+?)</p>\\s*-\\s*<a href="(?<url>[^"]+?)"\\s*>(?<content2>.+?)</a>";
rayaspnet 2012-11-14
  • 打赏
  • 举报
回复
尝试一下这个库: http://www.codeplex.com/htmlagilitypack 个人感觉用这个从html里面抓数据,要比正则表达式要效率要高点 代码 HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(@"<html><body><p><table id=""foo""><tr><th>hello</th></tr><tr><td>world</td></tr></table></body></html>"); foreach (HtmlNode table in doc.DocumentNode.SelectNodes("//table")) { Console.WriteLine("Found: " + table.Id); foreach (HtmlNode row in table.SelectNodes("tr")) { Console.WriteLine("row"); foreach (HtmlNode cell in row.SelectNodes("th|td")) { Console.WriteLine("cell: " + cell.InnerText); } } }
EnForGrass 2012-11-14
  • 打赏
  • 举报
回复
引用 5 楼 custom1234 的回复:
经过不断的替测试,将"[^"]"部分替换为.,就抓到数据了,但和我原来抓取的数据一样。

 string regex = @"(?i)<p\s*class=""t"">(?<content1>.*?)</p>\s*(?:-)\s*<a\s*href=""(?<url>[^""]+?)"">(?<content2>.+?)</a>";
            string myHtml = @"<p class=""t"">xxxxx</p><font>xxxxxxx</font>
<span>xxxxxxxx</span > 
<span>xxxx</span >
<p class=""t"">xxxxx</p> - <a href=""xxxxxx.html"">xxxxxxxx</a>
<span>xxxxxx</span >
<p class=""t"">xxxxxx</p> - <a href=""xxxxxx.html"">xxxx</a>
<div><p class=""t"">xxxxx</p></div>
<p class=""t"">xxxxxxx</p> - <a href=""xxxxx.html"">xxxxxxxxxxxx</a>
<table><tr><td>xxxxxx</td></tr></table>";
            Regex reg = new Regex(regex);

            MatchCollection ms = reg.Matches(myHtml);

            foreach (Match m in ms)
            {
                Console.WriteLine(m.Value);
                Console.WriteLine(m.Groups["url"].Value);
                Console.WriteLine(m.Groups["content1"].Value);
                Console.WriteLine(m.Groups["content2"].Value);
                Console.WriteLine("-------------------------------");

            }
custom1234 2012-11-14
  • 打赏
  • 举报
回复
经过不断的替测试,将"[^"]"部分替换为.,就抓到数据了,但和我原来抓取的数据一样。
custom1234 2012-11-14
  • 打赏
  • 举报
回复
引用 2 楼 Chinajiyong 的回复:
C# code?1234567891011121314string regex = "(?i)<p\s*class=\"t\">(?<content1>.*?)</p>\s*(?:-)\s*<a\s*href=\"(?<url>[^"]+?)\">(?<content2>.+?)</a>"; Regex reg = new Regex(regex , RegexOpt……
经过不断的替测试,将"[^"]"部分替换为.,就抓到数据了,但和我原来的一点。
custom1234 2012-11-14
  • 打赏
  • 举报
回复
引用 2 楼 Chinajiyong 的回复:
C# code?1234567891011121314string regex = "(?i)<p\s*class=\"t\">(?<content1>.*?)</p>\s*(?:-)\s*<a\s*href=\"(?<url>[^"]+?)\">(?<content2>.+?)</a>"; Regex reg = new Regex(regex , RegexOpt……
没有抓取到数据!
EnForGrass 2012-11-14
  • 打赏
  • 举报
回复

string regex = "(?i)<p\s*class=\"t\">(?<content1>.*?)</p>\s*(?:-)\s*<a\s*href=\"(?<url>[^"]+?)\">(?<content2>.+?)</a>"; 
 
Regex reg = new Regex(regex , RegexOptions.IgnoreCase | RegexOptions.Compiled); 
 
MatchCollection ms = reg.Matches(myHtml);
 
foreach (Match m in ms) { string url = m.Groups["url"].Value;
 
string content1 = m.Groups["content1"].Value;
 
string content2 = m.Groups["content2"].Value;
 
}
EnForGrass 2012-11-14
  • 打赏
  • 举报
回复
试试 (?i)<p\s*class="t">(?<content1>.*?)</p>\s*(?:-)\s*<a\s*href="(?<url>[^"]+?)">(?<content2>.+?)</a>

62,074

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧