htmlagilitypack выявляет несоответствие - PullRequest
0 голосов
/ 23 марта 2011

Я использую htmlagilitypack & xpath.

Как я могу определить непостоянство в html.Например:

<table><tr><td>
<b>Car1</b><span>Color123</span>
<bCar2</b><span>Color333</span>
<b>Car3</b><span>Color221</span>
<b>Car4 <span>Color224</span>
<b>Car5</b><span>Color621</span>
</table></tr></td>

Car2 и Car4 жирный шрифт разбиты.

Проблема в том, что я использую root.SelectNodes ("// b [1]") [Index], и он пропускает индекс position2 (Car2) и ставит его на место Car3, а я даже не знаю, чтотакое случилось, если я не проверяю результаты вручную.По крайней мере, мне нужно иметь «пустую» позицию2 (Car2) и правильную позицию3 (Car3).

Пакет HtmlAgility не может определить и исправить это автоматически.doc.ParseErrors не может идентифицировать это.

Можете ли вы предложить некоторую комбинацию функций XPath, таких как Substring, Boolean, Concat, Number и т. Д.?Я не достаточно хорош в XPath, но я чувствую, что эти функции могут помочь в выявлении несоответствия.

ps HTML Tidy библиотека не может это исправить.Иногда он решает, что:

<b>Car4 <span>Color224</span></b>

Что не является правильным исправлением.

1 Ответ

0 голосов
/ 23 марта 2011

HtmlDocumemt.ParseErrors содержит 3 ошибки для вашего примера:

 - 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)

В общем случае невозможно: 1) определить ошибки так, как вы хотите, и 2) гораздо сложнее их исправить.Вам необходимо точно определить, какой формат вы ожидаете.

Вы можете использовать Html Agility Pack для выявления ошибок с конкретными требованиями.Например, вот фрагмент кода, который проверяет ваш документ на основе функционального требования, что «каждый дочерний элемент TD должен быть B или SPAN и не должен содержать более одного большого дочернего элемента»:

    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);
        }
    }

Чтобы исправить это, требуется доступ к необработанному тексту (возможно, Regex, и, кстати, Regex также может выявлять простые ошибки), потому что Html Agility Pack создает DOM, который не позволяет вам получить доступ к неправильным синтаксическим узлам.

...