如何使用正则表达式在C#中通过id获取HTML div元素的innertext

3
我正在使用WebClient获取完整的HTML代码。但我需要使用正则表达式从完整的HTML中获取指定的div。
例如:
<body>
<div id="main">
     <div id="left" style="float:left">this is a <b>left</b> side:<div style='color:red'> 1 </div>
     </div>
     <div id="right" style="float:left"> main side</div>
<div>
</body>

如果我需要名为'main'的div,函数就会返回。
<div id="left" style="float:left">this is a <b>left</b> side:<div style='color:red'> 1 </div>
     </div>
     <div id="right" style="float:left"> main side</div>

如果我需要名为“left”的
,函数将返回什么?
this is a <b>left</b> side:<div style='color:red'> 1 </div>

如果我需要一个名为“right”的div,函数将返回它。
 main side

我该怎么做?


关于您的评论;HTML Agility Pack 是正确的;您的 HTML 有误(格式不正确)。请查看 </body> 前面的那个标签,它应该是 </div> - 否则它将被认为是一个嵌套、未终止的 开始 <div> - Marc Gravell
2个回答

5

为什么人们一直坚持使用正则表达式来解析HTML?如果你排除了大量的边缘情况,可能可以做到…但是只需使用HTML Agility Pack,问题就解决了:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(...); // or Load
string main = doc.DocumentNode.SelectSingleNode("//div[@id='main']").InnerHtml;

(注意,我假设它不是xhtml;如果是xhtml,请使用XmlDocumentXDocument,并使用与上述非常相似的代码)

谢谢,这非常有帮助。但是HtmlAgilityPack工作不正常。当我在之前的示例上下载和测试时,doc.DocumentNode.SelectSingleNode("//div[@id='main']").InnerHtml返回 <div id="left" style="float:left">this is a <b>left</b> side:<div style="color:red"> 1 </div> </div> <div id="right" style="float:left"> main side</div><div> </div> - ebattulga
在问题的评论中已经解释了。简而言之,HTML Agility Pack 是正确的;源 HTML 是错误的。 - Marc Gravell

2
string divname = "somename";
Match m = RegEx.Match(htmlContent, "<div[^>]*id="+divname+".*?>(.*?)</div");
string contenct = m.Groups[1].Tostring();

如果您在所需的

内部有嵌套的
,则此方法将无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接