모든 요소를 ​​반복하고 텍스트를 얻으시겠습니까?

.net-4.0 c# html-agility-pack

문제

다음 코드를 사용하여 페이지의 모든 텍스트를 List<string>

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(content);

foreach (var script in doc.DocumentNode.Descendants("script").ToArray())
    script.Remove();

foreach (var style in doc.DocumentNode.Descendants("style").ToArray())
    style.Remove();

foreach (HtmlAgilityPack.HtmlNode node in doc.DocumentNode.SelectNodes("//text()"))
{
    string found = WebUtility.HtmlDecode(node.InnerText.Trim());
    if (found.Length > 2) // removes some unwanted strings
        query[item.Key].Add(found);
}
  • 그러나 일부 HTML은 여전히 </form> 과 같은 문자열에 들어가기 때문에이 코드를 좁히는 더 좋은 방법이 있으므로 각 태그의 텍스트 만 가져 오거나 다른 것을 사용하지 마십시오. 결과를 구문 분석하여 <*> 태그?

수락 된 답변

이것은 HAP에 포함 된 기능만을 사용하여 쉽게 수행 할 수 있습니다.

HtmlDocument doc = new HtmlWeb().Load("http://www.google.com");
List<string> words = doc.DocumentNode.DescendantNodes()
        .Where(n => n.NodeType == HtmlNodeType.Text
          && !string.IsNullOrWhiteSpace(HtmlEntity.DeEntitize(n.InnerText))
          && n.ParentNode.Name != "style" && n.ParentNode.Name != "script")
        .Select(n => HtmlEntity.DeEntitize(n.InnerText).Trim())
        .Where(s => s.Length > 2).ToList();

결과는 길이가 2 이상이고 모든 것이 이미 이스케이프 된 단어 목록이므로 WebUtility 가 필요하지 않습니다.




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