Удаление всех элементов из HTML, которые дали класс, используя Agility Pack - PullRequest
0 голосов
/ 04 мая 2011

Я пытаюсь выбрать все элементы, которые имеют данный класс, и удалить их из строки HTML.

Это то, что у меня до сих пор, похоже, ничего не удаляется, хотя источник четко показывает 4 элемента с таким именем класса.

// Filter page HTML to display required content
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();

// filePath is a path to a file containing the html
htmlDoc.LoadHtml(pageHTML);

// ParseErrors is an ArrayList containing any errors from the Load statement);
if (!htmlDoc.ParseErrors.Any())
{
    // Remove all elements marked with pdf-ignore class
    HtmlNodeCollection nodes = htmlDoc.DocumentNode.SelectNodes("//body[@class='pdf-ignore']");

    // Remove the collection from above
    foreach (var node in nodes)
    {
        node.Remove();
    }
}

РЕДАКТИРОВАТЬ: просто чтобы уточнить, что документ разбирается, и строка SelectNodes ударил, просто ничего не возвращая.

Вот фрагмент HTML-кода:

<input type=\"submit\" name=\"ctl00$MainContent$PrintBtn\" value=\"Print Shotlist\" onclick=\"window.print();\" id=\"MainContent_PrintBtn\" class=\"pdf-ignore\">

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

РЕДАКТИРОВАТЬ: в своем обновленном ответе вы опубликовали часть строки HTML объявления элемента <input>, но вы пытаетесь сопоставить элемент <body> с классом pdf-ignore (согласно к вашему выражению //body[@class='pdf-ignore']).

Если вы хотите сопоставить все элементы документа с этим классом, вы должны использовать:

var nodes = htmlDoc.DocumentNode.SelectNodes("//*[contains(@class,'pdf-ignore')]");

код для получения ваших узлов. Это будет соответствовать всем элементам с указанным именем класса.

Ваш код кажется правильным, за исключением одной детали: условие htmlDoc.ParseErrors == null. Вы выбираете и удаляете узлы ТОЛЬКО, если свойство ParseErrors (тип IEnumerable<HtmlParseError>) равно null, но на самом деле, если ошибок не найдено, это свойство возвращает пустой список. Итак, изменив код на:

if (!htmlDoc.ParseErrors.Any())
{
    // some logic here
}

должен решить проблему.

0 голосов
/ 04 мая 2011

Ваш xpath, вероятно, не соответствует: вы пробовали "//div[class='pdf-ignore']" (нет "@")?

...