See the question and my original answer on StackOverflow

HtmlDocumemt.ParseErrors does contains 3 errors for your example:

 - Start tag <b> was not found (because there is a closing b without an opening one)
 - Start tag <tr> was not found (because the tr is inside an opening b without a closing one)
 - Start tag <td> was not found (same as tr)

In the general case, it's impossible to 1) identify errors the way you want, and 2) much more difficult to fix them. You would have to exactly define what's the expected format.

You can use the Html Agility Pack to identify errors with specific requirements. For example here is a piece of code, that validates your doc, base on the functional requirement that "every child element of a TD must be a B or a SPAN and must not contain more than one grand child element":

    HtmlDocument doc = new HtmlDocument();
    doc.Load("MyFile.htm");

    foreach (HtmlNode childOfTd in doc.DocumentNode.SelectNodes("//td/*"))
    {
        if ((childOfTd.Name != "b") && (childOfTd.Name != "span") || (childOfTd.ChildNodes.Count > 1))
        {
            Console.WriteLine("child error, outerHtml=" + childOfTd.OuterHtml);
        }
    }

To fix this requires raw text access (maybe a Regex, and BTW, a Regex can also identify simple errors) because the Html Agility Pack builds a DOM that does not let you access incorrect syntax nodes, by design.