2010-05-21 4 views
5

HTML 문자열을 가져 와서 유용하게 사용할 수있는 가장 좋은 방법은 무엇입니까?일반적으로 HTML을 구문 분석하는 C#?

기본적으로 URL을 가져 와서 .net에서 해당 URL의 HTML을 가져 오는 경우 응답이 표시되지만 파일이나 스트림 또는 문자열 형태로 표시됩니다.

실제 문서 나 XmlDocument 개체처럼 크롤링 할 수있는 콘텐츠를 원한다면 어떻게해야합니까?

나는이 문제에 대해 몇 가지 생각과 이미 구현 된 해결책을 가지고 있지만 커뮤니티가 이것을 어떻게 생각하는지보고 싶습니다.

+1

왜 XML 파싱을 위해 .NET 라이브러리를 사용하지 않는가? – Joren

+0

lol 나는 당신이 말한 것을 믿을 수 없다 ... html은 xml이 아니며 유효한 HTML을 만드는 특정 것들은 유효한 XML이 아니며 작동하지 않을 것이다. – War

답변

3

mshtml API를 사용합니다.

은 단순히 mshtml 어셈블리를 참조하고 네임 스페이스를 포함합니다.

거기에서 쿼리 할 수있는 HTMLDocument 객체를 선언 할 수 있습니다. API 디자인이 임의의 캐스팅을 강요하지만 일을 끝내고 항상 util에 넣을 수 있기 때문에 두통이 있습니다. 클래스는 자체 앱이므로 기본 앱 코드 클래스에 이상한 점을 지닐 필요가 없습니다.

7

HTML 페이지는 XHTML로 작성된 경우에도 유효한 XML이 아니기 때문에 표준 XML 객체에로드 할 수 없습니다.

HTML Agility Pack을 살펴보십시오. 이 .net 구성 요소는 유효하지 않은 DOM을 트래버스 할 수있게합니다.

+0

그게 내가 "XML 문서와 비슷하다"라고 말한 이유와 비슷합니다 ... 나는 이것을 잘 알고 있습니다. – War

1
var browser = new System.Windows.Forms.WebBrowser(); 
browser.Navigate(new System.Uri("http://example.com")); 
var doc = browser.Document; 

HtmlDocument는 일반적인 수집 될 수있는 유용한 ICollection<HtmlControl>members

, HtmlControlCollection이다 doc.All들을 갖는다.

HtmlControl.DomElement은 다른 답변에서 언급 된 mshtml 네임 스페이스를 말합니다.

일부 사용 예를 들어 당신이 the source of this project

+0

간단 ... 아주 간단합니다 ...시도해보십시오. 1. 새 콘솔 앱을 만듭니다. 2. 코드를 넣으십시오. 3. System.Windows.Forms에 대한 참조를 추가하십시오. 4.이를 실행하십시오. 이 샘플은 mshtml API를 사용하여 깨지기 쉬운 것으로 보이지만 민첩성 팩에 대해서는 확실하지 않습니다. – War

+0

@Wardy : STA 모드에서 실행할 수없는 COM 개체의 래퍼이므로 WebBrowser 컨트롤이 콘솔 응용 프로그램에서 작동하지 않습니다. – abatishchev

+0

정확히, 독립 실행 형 어셈블리의 일부로 작동하는 코드가 있습니다. 간단히 참조하고 사용합니다. 그것은 필요에 따라 최상의 솔루션은 항상 좋은 깨끗한 휴대용 하나입니다 :) – War

1

에 가장 쉬운 방법을 찾을 수는 System.Windows.Forms.HtmlDocument 클래스에로드하는 것입니다. 그런 다음 거기에서 DOM에 액세스 할 수 있습니다.

물론 HTTP 응답의 content-type을보고이 정보가 실제로 HTML인지 (질문에서 언급했는지) 아니면 이미지와 같은 이진 데이터인지 확인하는 것이 좋습니다.

HTTP는 기본적으로 바이너리 데이터 또는 마크 업 텍스트 인 원시 문서를 출력하며 브라우저는 일반적으로 응답 헤더에 제공되는 힌트를 사용하여 나머지 작업을 수행합니다. 물론 이것은 모두 HTTPWebResponse 클래스에 잘 포장되어 있으므로 바로 사용할 수 있습니다.

+0

웹 문제에 대한 Windows 양식에 대한 의존성을 기쁘게하지는 않지만 기술적으로 "가장 쉬운 방법"이라면 가장 실용적인 것은 아닙니다 ... 왜 비 관련 종속성을 도입합니까? – War

3

Tidy.net을 사용하여 응답에 포함 된 HTML 형식을 지정할 수 있습니다. 그런 다음이를 XmlDocument로로드하고 노드를 통과하여 원하는 것을 얻을 수 있습니다.

Tidy document = new Tidy(); 
TidyMessageCollection messageCollection = new TidyMessageCollection(); 

document.Options.DocType = DocType.Omit; 
document.Options.Xhtml = true; 
document.Options.CharEncoding = CharEncoding.UTF8; 
document.Options.LogicalEmphasis = true; 

document.Options.MakeClean = false; 
document.Options.QuoteNbsp = false; 
document.Options.SmartIndent = false; 
document.Options.IndentContent = false; 
document.Options.TidyMark = false; 

document.Options.DropFontTags = false; 
document.Options.QuoteAmpersand = true; 
document.Options.DropEmptyParas = true; 

MemoryStream input = new MemoryStream(); 
MemoryStream output = new MemoryStream(); 
byte[] array = Encoding.UTF8.GetBytes(xmlResult); 
input.Write(array, 0, array.Length); 
input.Position = 0; 

document.Parse(input, output, messageCollection); 

string tidyXhtml = Encoding.UTF8.GetString(output.ToArray()); 

XmlDocument outputXml = new XmlDocument(); 
outputXml.LoadXml((tidyXhtml); 
+0

이 구성 요소에 대한 자세한 설명서는 무엇입니까? – Smith

+0

tidy.net이 파생 된 깔끔한 프로젝트를 사용해보십시오. .net가 아니라 사용법에 대한 아이디어를 제공해야합니다. http://tidy.sourceforge.net/ – skyfoot

+0

흥미 롭습니다.하지만 코드를 읽을 수있는 상태로 만들려면 많은 코드가 필요하십니까? ... 비록 내가 추측하지만 그것을 작성해야만해도 나쁘지는 않다 ... 그러나 나는 성능에 대해 질문 할 것이다. – War

관련 문제