Program Tip

Html Agility Pack은 여전히 ​​최고의 .NET HTML 파서입니까?

programtip 2020. 12. 11. 19:17
반응형

Html Agility Pack은 여전히 ​​최고의 .NET HTML 파서입니까?


Html Agility Pack얼마 전에 StackOverflow 질문에 대한 답변으로 제공되었지만 여전히 최선의 선택입니까? 고려해야 할 다른 옵션은 무엇입니까? 더 가벼운 것이 있습니까?


비교 스프레드 시트 가 있습니다.

요약해서 말하자면:

CsQuery 성능 대 Html Agility Pack 및 Fizzler 필자는 CsQuery를 내가 아는 유일한 실용적인 대안 (HtmlAgilityPack 확장 인 Fizzler)과 비교하기 위해 몇 가지 성능 테스트를 구성했습니다. 세 가지 문서에 대해 테스트했습니다.

  • 지글 지글 테스트 문서 (약 11k)
  • "치즈"에 대한 위키피디아 항목 (약 170k)
  • 단일 페이지 HTML 5 사양 (약 6MB)

전반적인 결과는 다음과 같습니다.

  • HAP는 HTML 문자열을 객체 모델에로드하는 데 더 빠릅니다. 이것은 Fizzler가 색인을 작성하지 않는다고 생각하기 때문에 (또는 아마도 비교적 간단한 색인 만 작성한다고 생각하기 때문에) 의미가 있습니다. CsQuery는 문서를로드하는 데 1.1 ~ 2.6 배 더 오래 걸립니다. 자세한 내용은 아래에서 확인하세요.
  • CsQuery는 거의 모든 것에서 더 빠릅니다. 때로는 10,000 개 이상의 요인에 의해 발생합니다. 한 가지 예외는 "*"선택기이며, 가끔 Fizzler가 더 빠릅니다. 모든 테스트에 대해 결과가 완전히 열거됩니다. 이 경우 트리의 모든 노드가 열거됩니다. 따라서 이것은 데이터 구조만큼 선택 엔진을 테스트하지 않습니다.
  • CsQuery는 브라우저와 동일한 결과를 반환하는 데 더 나은 작업을 수행했습니다. 여기의 각 선택기는 jQuery 1.7.2를 사용하여 Chrome의 동일한 문서에 대해 확인되었으며 숫자는 CsQuery에서 반환 된 것과 일치합니다. 이는 HtmlAgilityPack이 선택적 (누락 된) 태그를 다르게 처리하기 때문일 수 있습니다. 또한 nth-child는 Fizzler에서 완전히 구현되지 않습니다. 간단한 값만 지원합니다 (공식이 아님).

HTML 파싱에 관해서는 실제와 비교할 수 없습니다. 이것은 validator.nu 파서 의 C # 포트입니다 . 이것은 Gecko 기반 브라우저 (예 : Firefox)에서 사용하는 것과 동일한 코드 기반입니다. 저장소가 약간 먼지가 많아 보이지만 속지 마십시오. 포트가 훌륭합니다. 그냥 간과되었습니다. 약 한 달 전에 CsQuery통합했습니다 . 모든 CsQuery 테스트 (C #로 이식 된 대부분의 jQuery 및 Sizzle 테스트 포함)를 통과합니다.

C #으로 작성된 다른 HTML5 파서 또는 누락, 선택 사항 및 잘못된 태그 처리 측면에서 좋은 작업을 수행하는 데 원격으로 근접한 다른 파서도 알지 못합니다. 이것은 단지 훌륭한 일을하는 것이 아니라 표준을 준수합니다.

위에서 링크 한 저장소는 원래 포트이며 XML 노드 트리를 생성하는 기본 래퍼를 포함합니다. CsQuery 버전 1.3 이상은이 파서를 사용합니다.


도 있습니다 AngleSharp은

AngleSharp는 HTML, SVG 및 MathML과 같은 꺾쇠 괄호 기반 하이퍼 텍스트를 구문 분석하는 기능을 제공하는 .NET 라이브러리입니다. 유효성 검사가없는 XML도 라이브러리에서 지원됩니다. AngleSharp의 중요한 측면은 CSS도 구문 분석 할 수 있다는 것입니다. 파서는 공식 W3C 사양을 기반으로합니다. 이것은 주어진 소스 코드의 완벽하게 이식 가능한 HTML5 DOM 표현을 생성합니다. querySelector 또는 querySelectorAll과 같은 현재 기능도 트리 순회를 위해 작동합니다.


Html Agility Pack은 얼마 전에 StackOverflow 질문에 대한 답변으로 제공되었습니다.

Html Agility Pack은 여전히 ​​HTML 구문 분석을위한 뛰어난 솔루션입니다.

여전히 최선의 선택입니까?

베스트? 모든 것이 당면한 작업에 달려 있지만 일반적으로 나는 그렇게 생각합니다. 이상적이지 못한 경우가 있지만 일반적으로 훌륭한 일을 할 것입니다.

더 가벼운 것이 있습니까?

이것을 시도해 볼 수 있습니다 : http://csharptest.net/browse/src/Library/Html/ Regex를 통해 HTML / XML을 분리하는 소스 파일로 가득 찬 손에 지나지 않습니다. 경량 DOM 및 XPath를 지원하지만 그 밖의 많은 것은 지원하지 않습니다. ( 도움말 내용 )

[예]

public void TestParse() {
        string notxml = "<html id=a ><body foo='bar' bar=\"foo\" />";
        var html = new HtmlLightDocument(notxml).Root;

        Assert.AreEqual("html", html.TagName);
        Assert.AreEqual(1, html.Attributes.Count);
        Assert.AreEqual("a", html.Attributes["id"]);
        Assert.AreEqual(1, html.Children.Count);
}

또는 DOM 트리를 빌드하는 대신 파서를 직접 사용할 수 있습니다. IXmlLightReader 인터페이스를 구현하고 정적 XmlLightParser.Parse 메서드를 호출하면 됩니다.

추신 : 내부 논쟁을 해결하기 위해 작성되었습니다. Regex HTML 구문 분석 할 수 있습니다 ! 그 이후로 우리는 어디에나 임베드 할 수있을만큼 가볍기 때문에 실제로 많은 용도를 찾았습니다. 여전히 DOM 계층 구조 빌더를 혼동하는 방법이 있지만 파서가 처리 할 수없는 HTML을 찾지 못했습니다.


나는 이것을 꽤 흐름이 쉬운 API 전에 사용했습니다. C # /. Net 도메인에서 이것은 매우 좋은 선택이라고 생각합니다.

여기에 자바 라이브러리가 있습니다 . 개인적인 경험이 없어도 꽤 좋아 보인다.


가장 좋은 것은 매우 상대적인 용어입니다. 귀하의 질문에 대해 신뢰할 수있는 도구를 찾고 있다고 생각하므로이 기능을 고려해야한다고 생각합니다. 도구를 제공하는 회사의 지원과 힘을 찾을 것입니다. 사용하는 도구에 대해 지원에 문의하려고 할 때 끔찍한 느낌이며 대답은이 회사가 더 이상 존재하지 않는다는 것입니다. HAP는 개발자 커뮤니티에서 유지 관리하므로 오히려 그녀를 신뢰하고 싶습니다.


.NET세상 밖을 볼 준비가 되었다면 PythonSO 커뮤니티는 Beautiful Soup을 추천 합니다 (예 : html-parser-in-python) .

Beautiful Soup은 화면 스크래핑과 같은 빠른 처리 프로젝트를 위해 설계된 Python HTML / XML 파서입니다.

참고 URL : https://stackoverflow.com/questions/1065031/is-the-html-agility-pack-still-the-best-net-html-parser

반응형