아마도 언젠가는 애플리케이션의 웹사이트나 HTML 문서에서 정보를 얻어야 할 것입니다. jsoup 라이브러리를 사용하면 작업이 크게 단순화될 것이라고 더 이상 고민하지 않겠습니다. Wiki 에 따르면 jsoup는 HTML 문서에 저장된 데이터를 구문 분석, 추출 및 조작하기 위해 설계된 오픈 소스 Java 라이브러리입니다.
빠른 시작
라이브러리는 jar 파일로 다운로드하여 프로젝트에 배치하거나 Maven/Gradle을 사용하여 연결할 수 있습니다. 기사 마지막 부분에 공식 웹사이트 링크를 남겨두겠습니다. 여기에서 현재 버전의 라이브러리를 찾을 수 있습니다. 이 예에서는 Maven을 통한 연결을 사용합니다. 종속성을 추가해 보겠습니다.<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
용법
우선,Document
구문 분석 소스를 나타내는 org.jsoup.nodes.Document에서 클래스의 인스턴스를 가져와야 합니다. 로컬 파일일 수도 있고 링크일 수도 있습니다. 예를 들어, 이 기사에서는 yandex.ru 웹사이트를 사용하여 최신 뉴스 피드를 가져오려고 합니다.
Document doc = Jsoup.connect("https://yandex.ru/")
.userAgent("Chrome/4.0.249.0 Safari/532.5")
.referrer("http://www.google.com")
.get();
User Agent
방문 중인 사이트에 전달되는 식별자입니다. 많은 사이트에서 이는 스팸 방지 필터의 가장 중요한 기준입니다. Referrer
요청 소스의 URL을 포함합니다. 이 메소드는 get()
처리된 IOException을 발생시키므로 모든 것을 try/catch
블록으로 래핑하거나 throws
. 이제 이 페이지의 소스 코드를 받았습니다. 필요한 경우 jsoup 라이브러리 자체가 손상된 요소를 복원할 수 있습니다. 이제 우리가 해야 할 일은 검색 범위를 별도의 블록으로 좁히는 것뿐입니다. 이 방법에는 select()
다양한 용도가 있습니다. 태그, 속성, 클래스 및 기타 매개변수를 기준으로 요소를 검색할 수 있습니다. 거의 모든 최신 브라우저는 선택한 요소의 소스 코드를 빠르게 검색하는 기능을 지원합니다. 간단한 조작을 통해 필요한 요소의 소스 코드를 찾고 div
지정된 클래스가 있는 블록을 가져와 샘플링에 사용할 수 있습니다. org.jsoup.select.Elements의 클래스를 사용하여 Elements
선택한 블록에서 모든 요소를 선택해 보겠습니다.
Elements listNews = doc.select("div#tabnews_newsc.content-tabs__items.content-tabs__items_active_true");
이제 다음과 같은 것이 있습니다. 이제 우리가 해야 할 일은 작은 루프를 사용하여 모든 요소를 반복하는 것입니다.
for (Element element : listNews.select("a"))
System.out.println(element.text());
이 방법을 text()
사용하면 마크업 코드를 삭제하고 들어오는 모든 요소에 대한 텍스트 조합만 남길 수 있습니다. 실행 결과는 다음과 같습니다. 수신된 실제 행 수가 페이지의 실제 표시와 일치하지 않는다는 것을 쉽게 알 수 있습니다. 여기에 함정이 있습니다. 마크업의 소스코드를 보면 특정 시간 간격으로 최신 뉴스가 애니메이션으로 바뀌는 것을 알 수 있습니다. 이러한 "돌" 중 일부는 추가 샘플링과 테스트를 통해 해결됩니다. 처음 5개 요소에는 필요한 정보가 포함되고 여섯 번째 요소에는 스크립팅된 빈 줄만 포함되는 것으로 나타날 수 있습니다. 또한 블록에 식별자가 없는 경우 메서드를 사용하여 get(int index)
해당 요소의 위치 번호를 직접 가리키는 것이 가능합니다.
System.out.println(listNews.select("a").get(2).text());
GO TO FULL VERSION