2012-07-05 5 views
3

HtmlAgilityPack을 사용하여 많은 웹 사이트를 긁고 있습니다. 문제는 비어 있거나 \ n, 공백 및 \ r 질량을 포함하는 대부분의 장소에 TextNodes를 삽입하는 것입니다.HtmlAgilityPack에서 쓸데없는 텍스트 노드 제거

방화범이 보이지 않지만 HtmlAgilityPack에서 자식 노드를 세면 문제가 발생하는 경향이 있습니다.

HtmlAgilityPack이이를 중지 시키거나 최소한이 텍스트 노드를 지우는 방법이 있습니까? (나는 유용한 것들을 유지하고 싶다). 우리가 여기에있는 동안, Comment와 Script 태그에 대해서도 마찬가지입니다.

답변

0

두 노드 사이에 "공백 없음"과 "일부 공백"사이에는 차이가 있습니다. 그래서 모든 공백 텍스트 노드가 여전히 중요하고 중요합니다.

"실제 스크래핑"을 시작하기 전에 html을 사전 처리하고 필요하지 않은 모든 노드를 제거 할 수 없었습니까?

"제거 방법"은 this answer도 참조하십시오.

0

원하지 않는 노드를 걸러 내기 위해 LINQ를 사용하는 노드에서 "자식"컬렉션 (또는 비슷한)에서 작동하는 확장 메서드를 만듭니다. 그런 다음 나무를 가로 지르면 다음과 같이하십시오.

myNode.Children.FilterNodes().ForEach(x => {}); 
0

나는 더 나은 답변을 원합니다. 다음은 테이블 행과 테이블 셀과 같은 자식 노드와 관련된 현재 메서드입니다. 노드는 TR, TH, TD이라는 이름으로 식별되므로 매번 #text을 제거합니다.

List<HtmlNode> rows = table.ChildNodes.Where(w => w.Name != "#text").ToList(); 

물론, 지루하고 작동하며 확장하여 향상시킬 수 있습니다.

0

다음과 같은 확장 방법을 사용할 수 있습니다

static class HtmlNodeExtensions 
{ 
    public static List<HtmlNode> GetChildNodesDiscardingTextOnes(this HtmlNode node) 
    { 
     return node.ChildNodes.Where(n => n.NodeType != HtmlNodeType.Text).ToList(); 
    } 
} 

을 그리고 다음과 같이 호출 :

List<HtmlNode> nodes = someNode.GetChildNodesDiscardingTextOnes();