如何/应该从没有正则表达式的特殊格式的HTML中检索数据

时间:2013-11-14 00:20:53

标签: c# html regex

我有一大堆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?

2 个答案:

答案 0 :(得分:1)

只是一个FYI正则表达式无法在任何可用的时尚中解析HTML ... RegEx match open tags except XHTML self-contained tags仅适用于那些偶然发现此帖子的人。

现在根据您的要求,您是否尝试过使用XmlDocumentXDocument

只需尝试以下操作(请注意,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/,将数据粘贴到底部,使用顶部的正则表达式部分进行播放,直到您对结果感到满意为止,然后循环遍历数据并提取您需要的内容内容。

(我不确定我是否会这样做,但有时快速解决方案比长期更“正确”的答案更好。)