HtmlAgilityPack SelectNodes, Disposing

c# html-agility-pack web-scraping

문제

SelectNodes 사용하여 HtmlAgilityPack을 사용하여 일부 화면을 스크래핑하고 각 노드에서 일부 값을 반환하려고했습니다.

여기에 코드가있다.

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. HtmlDocument 에서 새 문서 인스턴스를 만들지 않고도 SelectNodes 에서 반환 된 각 테이블의 값을 선택하는 방법이 있습니까?

  2. _document.LoadHtml(html) ;을 사용할 때마다 메모리 누수가 있음을 알았 기 때문에 HtmlDocument 를 처리하는 방법이 있습니까?

인기 답변

(자세한 내용은 Html Agility Pack - 문제 선택 하위 노드 참조 )


다른 HtmlDocument 객체를 만들거나 다른 HTML을로드 할 필요는 없습니다 . 당신은 단지해야만합니다 :

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

핵심은 //tbody 대신 .//tbody 를 사용 .//tbody 것입니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.