Node.js로 HTML 페이지를 구문 분석하는 방법


92

많은 양의 HTML 페이지를 구문 분석 (서버 측)해야합니다.
우리 모두는 regexp가 여기에 갈 길이 아님에 동의합니다.
자바 스크립트가 HTML 페이지를 파싱하는 기본 방법 인 것 같지만 그 가정은 자바 스크립트가 브라우저 내부에 가지고있는 모든 DOM 기능을 가진 서버 측 코드에 의존합니다.

Node.js에 이러한 기능이 내장되어 있습니까?
서버 측에서 HTML을 구문 분석하는이 문제에 대한 더 나은 접근 방법이 있습니까?

답변:


87

npm 모듈 jsdomhtmlparser 를 사용하여 Node.JS에서 DOM을 만들고 구문 분석 할 수 있습니다.

기타 옵션은 다음과 같습니다.

  • Python 용 BeautifulSoup
  • html을 xhtml 로 변환 하고 XSLT를 사용할 수 있습니다.
  • .NET 용 HTMLAgilityPack
  • .NET 용 CsQuery (내가 가장 좋아하는)
  • spidermonkey 및 rhino JS 엔진에는 기본 E4X 지원이 있습니다. 이것은 html을 xhtml로 변환하는 경우에만 유용 할 수 있습니다.

이 모든 옵션 중에서 표준 W3C DOM 접근 자 메서드를 사용하고 클라이언트와 서버 모두에서 코드를 재사용 할 수 있기 때문에 Node.js 옵션을 사용하는 것을 선호합니다. BeautifulSoup의 방법이 W3C dom과 더 비슷하기를 바라며, XSLT를 작성하기 위해 HTML을 XHTML로 변환하는 것은 단순한 가학 적이라고 생각합니다.


3
선이란 무엇을 의미합니까? 신뢰할 수 있고 빠르고 쉬울까요? 이 두 가지를 사용하면 원하는 경우 jQuery 서버 측을 사용할 수있을만큼 충분히 견고 합니다 .
kzh

1
@kzh 프로세스가 한 시간 또는 하루 안에 끝나면 신뢰할 수 있고 쉬운 것이 더 중요합니다.
Itay Moav -Malimovka 2011 년

노드 옵션은 신뢰할 수 있고 이미 DOM에 익숙하다면 확실히 쉽습니다.
kzh

당신이 htmlparser 쏠 경우, 함께가는 시도 github.com/fb55/node-htmlparser 첫째. 재 작업 된 버전으로 보이며보다 적극적으로 유지 관리됩니다.
cburgmer

인터넷에서 검색했지만 htmlparser에 대한 좋은 튜토리얼을 찾을 수 없습니다.
songyy

62

Cheerio를 사용하십시오 . jsdom만큼 엄격하지 않으며 스크래핑에 최적화되어 있습니다. 보너스로 이미 알고있는 jQuery 선택기를 사용합니다.

❤ 익숙한 구문 : Cheerio는 핵심 jQuery의 하위 집합을 구현합니다. Cheerio는 jQuery 라이브러리에서 모든 DOM 불일치 및 브라우저 크랙을 제거하여 정말 멋진 API를 보여줍니다.

ϟ 매우 빠름 : Cheerio는 매우 간단하고 일관된 DOM 모델로 작동합니다. 결과적으로 구문 분석, 조작 및 렌더링이 매우 효율적입니다. 예비 엔드-투-엔드 벤치 마크에 따르면 cheerio는 JSDOM보다 약 8 배 빠릅니다.

❁ 엄청나게 유연함 : Cheerio는 @ FB55의 용서하는 htmlparser를 둘러 쌉니다. Cheerio는 거의 모든 HTML 또는 XML 문서를 구문 분석 할 수 있습니다.


8
그러나 DOM을 빌드하지 않고 XPath를 허용하지 않습니다. jQuery 구문은 확실히 해당 라이브러리의 단점입니다.
polkovnikov.ph 2014 년

2
내 경험상 @ polkovnikov.ph는 완전한 DOM 구문 분석이 필요한 응용 프로그램이 거의 없으며, DOM 구축은 jQuery / Cheerio의 빠른 "지연"평가에 비해 매우 비쌉니다. 이런 의미에서 jQuery 스타일의 구문 분석이 이점이지만 애플리케이션에서 DOM 서버 측을 조작해야하는 경우 jsdom을 사용하는 것이 좋습니다.
Meekohi 2014 년

jsdom그것을 위해 너무 느립니다 : /
polkovnikov.ph

2
@MohamedMansour는 Cheerio를 프로덕션에 사용하고 몇 초 만에 수천 페이지를 스크랩하는 가치에 대해 설명합니다. "빠름"과 "느림"은 모두 응용 프로그램 및 대역폭과 관련이 있습니다.
Meekohi

엄격하지 않음 : +1. jQuery 구문 : +1.
cheesus


6

FB55의 Htmlparser2 가 좋은 대안 인 것 같습니다.


3
이 반환 형식으로 무엇을해야 합니까? for 루프와 트리 순회를 작성 하시겠습니까?
polkovnikov.ph 2014 년

열기 / 닫기 태그 이벤트에 등록 할 수 있으므로 원하는 항목에 따라 정말 좋은 대안 imho입니다.
Phil

@ polkovnikov.ph htmlparser2에서 반환 한 형식으로 작업하는 동일한 작성자의 domutils 패키지 도 있습니다.이 패키지에는 많은 메소드가 있으며 일부는 DOM 메소드와 동일한 구문을 가지고 있으며 일부는 다릅니다. 실제로 개체를 수동으로 탐색 할 필요가 없습니다. 거기에 문서가 없지만 소스 코드는 매우 명확합니다. 모든 것이 예상대로 작동합니다.
esp

아직은 아니지만 확장을 중단하는 이유는 무엇입니까? 이미 가지고있는 기능을 사용하는 것은 그리 어렵지 않습니다.
esp

2

jsdom은 실제 화면 스크래핑 작업을 수행하기에는 너무 엄격하지만, beautifulsoup은 나쁜 마크 업에 질식하지 않습니다.

node-soupselect 는 Python의 beautifulsoup을 nodejs로 포팅하고 아름답게 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.