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 루프 내부에서 자식을 선택하려고 할 때 실제로 문서 루트에서 검색한다는 것을 알아 챘습니다. 정말로 짜증나는 것.
질문 :
HtmlDocument
에서 새 문서 인스턴스를 만들지 않고도 SelectNodes
에서 반환 된 각 테이블의 값을 선택하는 방법이 있습니까?
_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
것입니다.