我有一大堆HTML,这只是一堆:
<li id="entry-c7" data-user="ThisIsSomeonesUsername">
<img width="28" height="28" class="avatar" src="http://very_long_url.png">
<span class="time">6:07</span>
<span class="username">ThisIsSomeonesUsername</span>
<span class="message">This is my message. It is nice, no?</span>
</li>
一遍又一遍地重复十万次(当然,内容不同)。这全部取自HTMLDocument,检索包含所有这些的元素。从Windows窗体中的WebBrowser检索文档。这看起来像:
HtmlDocument document = webBrowser1.Document;
HtmlElement element = document.GetElementById(chatElementId);
假设“chatElementId”只是一些已知的ID。我想要做的是在“时间”(本例中为6:07),“用户名”(ThisIsSomeonesUsername)和“消息”(这是我的消息......等)中检索内容。消息部分几乎可以包含任何内容,包括更多的html(例如链接,图像等),但我希望保持完整。我将使用正则表达式来解析使用上述方法检索的元素的InnerHtml,但显然这将导致宇宙的破坏。那我该怎么做呢?
编辑:人们一直在建议使用Html Agility Pack,那么在没有使用完整的HTML源代码的情况下,有没有简单的方法可以在Html Agility Pack中执行此操作?我不确定这个类之外的其他html是否都那么棒......但我是否应该通过整个html?
答案 0 :(得分:1)
只是一个FYI正则表达式无法在任何可用的时尚中解析HTML ... RegEx match open tags except XHTML self-contained tags仅适用于那些偶然发现此帖子的人。
现在根据您的要求,您是否尝试过使用XmlDocument或XDocument?
只需尝试以下操作(请注意,img标记缺少结束/>
),如果HTML中的情况不符合这种情况,则无法使用它。)
//parse the xml
var xDoc = XDocument.Parse(html);
//create our list of results (basic tuple here, could be your class)
List<Tuple<string, string, string>> attributes = new List<Tuple<string, string, string>>();
//iterate all li elemenets
foreach (var element in xDoc.Root.Elements("li"))
{
//set the default values
string time = "",
username = "",
message = "";
//get the time, username message attributes
XElement tElem = element.Elements("span").FirstOrDefault(x => x.Attributes("class").Count() > 0 && x.Attribute("class").Value == "time");
XElement uElem = element.Elements("span").FirstOrDefault(x => x.Attributes("class").Count() > 0 && x.Attribute("class").Value == "username");
XElement mElem = element.Elements("span").FirstOrDefault(x => x.Attributes("class").Count() > 0 && x.Attribute("class").Value == "message");
//set our values based on element results
if (tElem != null)
time = tElem.Value;
if (uElem != null)
username = uElem.Value;
if (mElem != null)
message = mElem.Value;
//add to our list
attributes.Add(new Tuple<string, string, string>(time, username, message));
}
答案 1 :(得分:1)
阅读Nico答案的链接......我即将发布同一个(这很有趣)。
话虽如此,从你的评论中看起来你似乎是在关注正则表达式。所以,正则表达式 这应该不难做到。
转到http://regexpal.com/,将数据粘贴到底部,使用顶部的正则表达式部分进行播放,直到您对结果感到满意为止,然后循环遍历数据并提取您需要的内容内容。
(我不确定我是否会这样做,但有时快速解决方案比长期更“正确”的答案更好。)