2011-08-29 3 views
0

내 C# 프로그램에서 웹 사이트의 HTML을 구문 분석하고 싶습니다.간단한 XPath 쿼리 : 결과 없음

먼저 DLL을 사용하여 HTML을 XML로 변환합니다. 나는이에 대한 다음과 같은 방법을 사용하십시오

XmlDocument FromHtml(TextReader reader) 
{ 
    // setup SGMLReader 
    Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader(); 
    sgmlReader.DocType = "HTML"; 
    sgmlReader.WhitespaceHandling = WhitespaceHandling.None; 
    sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower; 
    sgmlReader.InputStream = reader; 

    // create document 
    XmlDocument doc = new XmlDocument(); 
    doc.PreserveWhitespace = true; 
    doc.XmlResolver = null; 
    doc.Load(sgmlReader); 
    return doc; 
} 

다음, 나는 웹 사이트를 읽고 header 노드를 찾아보십시오 : 그러나

var client = new WebClient(); 
var xmlDoc = FromHtml(new StringReader(client.DownloadString(@"http://www.switchonthecode.com"))); 
var result = xmlDoc.DocumentElement.SelectNodes("head"); 

,이 쿼리는 == 0 (수를 빈 결과를 제공). 내가 xmlDoc.DocumentElement 결과보기를 검사 할 때, 나는 다음을 참조하십시오 : 결과가없는 이유

VS watch

어떤 생각인가? 다른 사이트 (예 : http://www.google.com)를 시도하면 작동합니다.

+0

- 당신이 기술적으로 스크린 샷 – Cameron

답변

2

명시 적으로 네임 스페이스를 사용하여 선택해야합니다 (question 참조). `head`에 네임 스페이스가있어

XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable); 
manager.AddNamespace("ns", "http://www.w3.org/1999/xhtml"); 

doc.DocumentElement.SelectNodes("ns:head", manager); 
1

대신 HTML Agility Pack을 사용할 수 있습니다. 오픈 소스 HTML 파서입니다

+0

에서 볼 수는 TheCodeKing는 질문에 올바른 대답을했다. 그러나 네 제안을 시도하고 네임 스페이스가 필요 없기 때문에 더 쉽게 작동합니다! 감사. –