Jsoup
Jsoup 이란?
- Java로 만들어진 HTML 파서 라이브러리이다.
- URL, 파일, 문자열을 Source로 HTML을 파싱할 수 있다.
- DOM 구조 추적 및 CSS 선택자를 사용해 데이터를 추출할 수 있다.
- 문서 내 HTML 요소, 속성, 텍스트를 조작할 수 있다.
- 정돈된 형태의 html을 출력할 수 있다.
Jsoup 주요 요소
- Document
- Element
- Elements
- Connection
- Response
- Jsoup으로 URL에 접속해 얻어온 결과로, Document와 다르게 status의 코드, 메시지, charset 등의 헤더 메시지와 쿠키 등도 포함한다.
사용 준비
- jar 파일을 다운로드 받아서 class path에 추가하는 방법도 있다.
- Maven을 사용중이라면, 다음 의존성을 추가한다.
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.3</version>
</dependency>
- Gradle을 사용중이라면, build.gradle 파일에 다음 의존성을 추가한다.
implementation 'org.jsoup:jsoup:1.13.1'
수행 과정
- Jsoup을 사용해 파싱하는 과정은 이렇다.
- Connection 객체를 통해 URL에 접속한다.
- 또는, local file이나 문자열에 접근한다.
- Response 객체에서 세션 ID 등의 쿠키, HTML Document를 얻어온다.
- Document의 Element들을 파싱한다.
- 파싱의 대상은 string, local file, URL 등을 source로 할 수 있다.
구문 분석(파싱)
1. URL에서 문서 파싱
- 웹에서 HTML 문서를 가져와서 구문을 분석하고, 파싱하는 방법
Document doc = Jsoup.connect("http://example.com/").get();
String title = doc.title();
- Jsoup.connect(String url)
- URL을 인자로 주어 해당 주소에 접속하여, Response를 반환한다.
- 이어서 Response의 .get() 메소드를 통해 리턴값으로 Document를 얻어온다.
- 이를 축약하여 바로 connect().get() 으로 사용할 수도 있다.
Document doc = Jsoup.connect("http://example.com")
.data("query", "Java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.post();
- URL을 가져오는 동안 오류 발생을 방지하기 위한 IOException을 처리해주어야 한다.
- 또한, Builder 패턴 형식으로 여러 정보들을 직접 넣어 .post() 메소드를 이용해 Document를 얻을 수도 있다.
- 이 방법은 웹 URL(http, https)만 지원한다.
- 파일에서 로드하는 경우, 2번의 parse(File in, String charsetName) 을 사용한다.
- 그 후, 이 Document 객체를 이용해 원하는 Element 등을 파싱하여 사용한다.
2. 파일에서 문서 파싱
- HTML이 포함 된 파일이 디스크에 존재할 경우, 해당 경로를 이용해 데이터를 파싱하는 방법
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
- Jsoup.parse(File in, String charsetName, String baseUri)
- 파일을 읽어오는 동안 오류 발생을 방지하기 위한 IOException을 처리해주어야 한다.
3. 문자열에서 문서 파싱
String html = "<html><head><title>First parse</title></head>"
+ "<body><p>Parsed HTML into a doc.</p></body></html>";
Document doc = Jsoup.parse(html);
- Jsoup.parse(String html)
- string 형태로 존재하는 html에서 Document 객체를 얻어오기 위한 메소드
- Jsoup.parse(String html, String baseUri)
- 페이지가 웹에서 왔고, 절대 URL을 통해 얻기 위하는 경우 사용하는 메소드
4. 본문 일부를 가진 문자열에서 파싱
String html = "<div><p>Lorem ipsum.</p>";
Document doc = Jsoup.parseBodyFragment(html);
Element body = doc.body();
- Jsoup.parseBodyFragment(String html)
- 이 메소드는, 구문 분석된 HTML을 body 요소에 삽입한다.
- 즉, Jsoup.parse(String html) 방법을 사용하면 일반적인 파싱과 동일한 결과를 얻지만, 이 메소드를 쓰면 사용자가 제공한 HTML이 body의 요소로 구문 분석 되어 반환한다.
데이터 추출 - DOM 메소드를 이용한 문서 탐색
- 일반적으로 DOM Tree 구조를 이용한 탐색 방법을 사용한다.
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8", "http://example.com/");
Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
String linkHref = link.attr("href");
String linkText = link.text();
}
요소 찾기
- getElementById(String id)
- getElementsByTag(String tag)
- getElementsByClass(String className)
- getElementsByAttribute(String key) (및 관련 방법)
- 요소 형제
- siblingElements()
- firstElementSibling()
- lastElementSibling()
- extElementSibling()
- previousElementSibling()
- 그래프
- parent()
- children()
- child(int index)
요소 데이터
- 속성 가져 오기 및 설정
- attr(String key)
- attr(String key, String value)
- 모든 속성 얻기
- id()
- className()
- classNames()
- 텍스트 내용 가져 오기 및 설정
- 내부 HTML 콘텐츠 가져 오기 및 설정
- 외부 HTML 값 얻기
- 데이터 콘텐츠 (예 : script및 style태그) 가져 오기
- tag()
- tagName()
HTML 및 텍스트 조작
- append(String html)
- prepend(String html)
- appendText(String text)
- prependText(String text)
- appendElement(String tagName)
- prependElement(String tagName)
- html(String value)
데이터 추출 - 선택자 구문을 이용한 문서 탐색
공식 레퍼런스 참고
- Jsoup을 이용해 HTML 페이지를 파싱해서 데이터를 추출할 수도 있고, 데이터를 수정할 수도 있다.
그 외 레퍼런스
참고 - tistory 블로그1
참고 - tistory 블로그2
참고 - tistory 블로그3
공식 레퍼런스