HtmlAgilityPack SelectNodes, Disposing

c# html-agility-pack web-scraping

Вопрос

Я пытаюсь выполнить скрипинг экрана с помощью HtmlAgilityPack с помощью SelectNodes и получить некоторые значения из каждого возвращаемого узла

Вот код

private readonly HtmlDocument _document = new HtmlDocument();

public void ParseValues(string html)
{
    _document.LoadHtml(html);
    var tables = _document.DocumentNode.SelectNodes("//table");

    foreach (var table in tables)
    {
        _document.LoadHtml(table.OuterHtml);
        var value = _document.DocumentNode.SelectSingleNode("//tbody[1]/tr/td[0]");
    }
}

Но я заметил, что при попытке выбрать детей внутри цикла foreach он фактически ищет из корня документа. Что-то, что действительно раздражает.

Вопросов:

  1. Есть ли способ выбрать значения из каждой таблицы, возвращенной из SelectNodes без необходимости создавать новый экземпляр документа из HtmlDocument ?

  2. Есть ли способ распорядиться HtmlDocument , потому что я заметил, что есть утечка памяти каждый раз, когда я использую _document.LoadHtml(html) ;

Популярные ответы

(для более подробного объяснения см. Html Agility Pack - проблема выбора поднода )


Вам не нужно создавать другой объект HtmlDocument или загружать в него еще один HTML- HtmlDocument . Вам просто нужно сделать:

foreach (var table in tables)
{
    var value = table.SelectSingleNode(".//tbody[1]/tr/td[0]");
}

Ключ должен использовать .//tbody вместо //tbody .



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow