Html Agility Pack을 사용하여 HTML 조각을 파싱 할 수 있습니까?

.net c# html html-agility-pack parsing

문제

ASP.NET 페이지, 사용자 정의 컨트롤 및 마스터 페이지에서 LINKMETA 요소를 가져와 내용을 가져온 다음 작업중인 유틸리티에서 업데이트 된 값을이 파일에 다시 써야합니다.

정규 표현식을 사용하여 이러한 요소를 가져올 수는 있지만 그 방법에는 몇 가지 문제가 있습니다.

  • 입력 파일 중 많은 부분에 깨진 HTML (누락 / 시퀀스 외 요소 등)이 포함될 것으로 예상됩니다.
  • 주석을 포함하는 SCRIPT 요소 및 유효한 요소처럼 보이는 VBScript / JavaScript 등
  • IE 특수 조건의 조건부 주석과 METALINK 요소를 IE 조건부 주석 내에서 사용할 수 있어야합니다.
  • HTML이 정규 언어가 아닌 방법은 말할 것도 없습니다.

.NET에서 HTML 파서에 대한 연구를 수행했으며 많은 SO 게시물과 블로그에서 HTML 민첩성 팩을 권장합니다. 이전에는 사용 해본 적이 없으며 깨진 HTML 및 HTML 조각을 구문 분석 할 수 있는지 여부는 알 수 없습니다. 예를 들어 HTML 이나 BODY 없는 HEAD 요소 만 들어있는 사용자 정의 컨트롤을 상상해보십시오. 문서를 읽을 수는 있지만 누군가 조언 할 수 있다면 꽤 시간이 절약 될 것입니다. (대부분의 SO 게시물에는 전체 HTML 페이지 구문 분석이 포함됩니다.)

수락 된 답변

물론, 그것이 그것이 탁월한 것입니다.

사실, 야생에서 발견 할 수있는 많은 웹 페이지는 <html> 태그 누락 또는 부적절한 닫힌 태그로 인해 HTML 단편으로 설명 될 수 있습니다.

HtmlAgilityPack은 브라우저가 수행해야하는 작업을 시뮬레이션합니다. 때로는 일치하지 않는 태그의 뒤범벅이 무엇인지 파악하려고합니다. 불완전한 과학이지만 HtmlAgilgityPack이 잘합니다.


인기 답변

Html Agility Pack의 대안은 C # jQuery 포트 인 CsQuery입니다 .이 포트는 제가 주 저자입니다. 이 도구를 사용하면 CSS 선택기와 전체 Query API를 사용하여 DOM에 액세스하고 조작 할 수 있습니다. 많은 사람들이 XPATH보다 쉽게 ​​사용할 수 있습니다. 또한 HTML 구문 분석기는 다양한 목적을 염두에두고 특별히 고안되었으며 HTML 구문 분석을위한 몇 가지 옵션이 있습니다. 전체 문서 (누락 된 html, body 태그 추가 및 본문 내부의 고아 내용 이동)입니다. 콘텐츠 블록 (의미 - 전체 문서로 래핑되지는 않지만 브라우저에서와 마찬가지로 tbody 와 같은 선택적 태그는 자동으로 추가됩니다.), 태그가없는 실제 조각으로 생성 (예 : 빌딩 블록으로 작업하는 경우).

자세한 내용 은 새 DOM 만들기 를 참조하십시오.

또한 CsQuery의 HTML 파서는 선택적 닫기 태그에 대한 HTML5 사양을 준수하도록 설계되었습니다. 예를 들어 p 태그를 닫는 것은 선택 사항이지만 블록을 닫아야 할 때를 결정하는 특정 규칙이 있습니다. 브라우저와 동일한 DOM을 생성하려면 파서가 동일한 규칙을 구현해야합니다. CsQuery는 주어진 소스에 대해 브라우저 DOM과 높은 수준의 호환성을 제공하기 위해이 작업을 수행합니다.

CsQuery를 사용하는 것은 매우 간단합니다.

CQ docFromString = CQ.Create(htmlString); 
CQ docFromWeb = CQ.CreateFromUrl(someUrl);

// there are other methods for asynchronous web gets, creating from files, streams, etc.

// css selector: the indexer [] is like jQuery $(..)

CQ lastCellInFirstRow = docFromString["table tr:first-child td:last-child"];

// Text() is a jQuery method returning text contents of selection 

string textOfCell = lastCellInFirstRow.Text();

마지막으로 CsQuery는 클래스, ID, 속성 및 태그에 대한 문서를 색인화하여 Html Agility Pack에 비해 매우 빠르게 셀렉터를 만듭니다.



Related

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