HTML 민첩성 팩 HtmlDocument.DocumentNode가 null 인 이유는 무엇입니까?

asp.net c# html-agility-pack

문제

이 코드를 사용하여 HTML 스트림의 href 특성을 변경합니다.

먼저이 코드를 사용하여 전체 HTML 페이지를 다운로드합니다. (URL은 웹 페이지 주소 임)

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(URL);
HttpWebResponse myHttpWebResponse = 
                         (HttpWebResponse)myHttpWebRequest.GetResponse();

Stream s = myHttpWebResponse.GetResponseStream();

그러면 나는 이것을 처리한다.

HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(URL);
HttpWebResponse myHttpWebResponse = 
                         (HttpWebResponse)myHttpWebRequest.GetResponse();

Stream s = myHttpWebResponse.GetResponseStream();

s 는 html 스트림입니다.

하지만 예외가있어 doc.DocumentNode null입니다!

나는 많은 사이트를 시도했지만 doc.DocumentNode 는 null이다.

수락 된 답변

이것은 나를 위해 작동합니다.

using(WebClient client = new WebClient())
{
    client.Encoding = System.Text.Encoding.UTF8;
    var doc = new HtmlAgilityPack.HtmlDocument();
    doc.LoadHtml(client.DownloadString("http://www.google.com?q=stackoverflow"));
    foreach (var href in doc.DocumentNode.Descendants("a").Select(x => x.Attributes["href"]))
    {
        if (href == null) continue;
        href.Value = "http://ahmadalli.somee.com/default.aspx?url=" + HttpUtility.UrlEncode(href.Value);
    }
    StringWriter writer = new StringWriter();
    doc.Save(writer);
    var finalHtml = writer.ToString();
}

또한 URL을 올바르게 가져 오려면 HttpUtility.UrlEncode 를 참조하십시오. 그렇지 않으면 원본 url의 일부 매개 변수가 문제를 일으킬 수 있습니다.

HttpUtility.UrlDecode 를 사용하여 디코딩하십시오.


인기 답변

앵커 태그 참조가 잘못 이스케이프 된 문자열입니다.

...doc.DocumentNode.SelectNodes("/a")    //incorrect
...doc.DocumentNode.SelectNodes("//a")   //correct
...doc.DocumentNode.SelectNodes(@"/a")   //also correct

원래 코드는 노드를 선택하지 못하고 null로 평가됩니다. 이것은 전혀 링크가없는 문서에서 실패하지 않도록하기 위해 점검되어야합니다 (그러나 그럴 가능성은 희박합니다 :)

...doc.DocumentNode.SelectNodes("/a")    //incorrect
...doc.DocumentNode.SelectNodes("//a")   //correct
...doc.DocumentNode.SelectNodes(@"/a")   //also correct



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