웹 크롤링을 통해 데이터를 수집할 때는 HTML 내 텍스트를 정제하여 가공된 데이터를 얻는 것이 중요합니다. 수집된 데이터를 필터링하고 불필요한 정보를 제거해 유의미한 형태로 변환해야 이후 데이터 분석에 활용하기 쉽기 때문입니다. 이번 글에서는 HTML 내 텍스트 가공, 정규 표현식을 사용한 필터링, 불필요한 태그 제거에 대해 알아보고, 각 예제와 함께 실습해보겠습니다.
HTML 내 텍스트 가공하기
HTML 문서에서 데이터를 추출했을 때는 불필요한 공백이나 특수문자가 포함되어 있을 수 있습니다. JSoup를 사용하면 text() 메서드로 태그를 제외한 텍스트를 추출할 수 있으며, Java의 trim() 메서드나 replaceAll() 메서드를 사용해 공백이나 특수문자를 쉽게 제거할 수 있습니다.
// 기본적인 HTML 텍스트 가공 예제
Document doc = Jsoup.connect("https://example.com").get();
Element content = doc.selectFirst("div.content");
String rawText = content.text();
String processedText = rawText.trim().replaceAll("[^\\w\\s]", ""); // 특수문자 제거
System.out.println("가공된 텍스트: " + processedText);
이 예제에서는 div.content 요소에서 텍스트를 가져와 공백 제거와 특수문자 필터링을 통해 가공된 텍스트를 출력합니다. 이를 통해 HTML 페이지에서 수집한 데이터의 가독성을 높이고 분석하기에 적합한 형태로 가공할 수 있습니다.
또한, 공백이 포함된 경우 여러 줄에 걸쳐 텍스트가 작성된 경우에도 replaceAll("\\s+", " ")을 사용하여 한 줄로 정리할 수 있습니다.
// 텍스트를 한 줄로 정리하는 예제
String singleLineText = rawText.replaceAll("\\s+", " ");
System.out.println("한 줄로 정리된 텍스트: " + singleLineText);
텍스트 필터링 및 정규 표현식 사용법
특정 패턴에 맞는 텍스트만 필터링할 때는 정규 표현식을 사용하면 효과적입니다. 예를 들어, 이메일 주소나 전화번호와 같은 형식을 추출하거나 특정 단어가 포함된 텍스트를 필터링하는 경우가 있습니다. Java에서는 Pattern과 Matcher 클래스를 활용하여 정규 표현식을 통해 데이터를 가공할 수 있습니다.
// 정규 표현식을 통한 이메일 주소 추출 예제
String text = "문의: contact@example.com, 지원: support@example.org";
Pattern emailPattern = Pattern.compile("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}\\b");
Matcher matcher = emailPattern.matcher(text);
while (matcher.find()) {
System.out.println("추출된 이메일 주소: " + matcher.group());
}
위 예제에서는 정규 표현식을 사용해 문자열에서 이메일 주소를 추출합니다. 웹사이트의 연락처나 기타 텍스트에서 특정 패턴의 정보만 추출할 때 유용합니다. 이와 유사하게 특정 키워드가 포함된 문장만 추출하는 방법도 활용할 수 있습니다.
// 특정 키워드가 포함된 문장만 필터링
Pattern keywordPattern = Pattern.compile("(?i)지원"); // '지원' 키워드 포함된 텍스트 찾기
Matcher keywordMatcher = keywordPattern.matcher(text);
while (keywordMatcher.find()) {
System.out.println("키워드 포함 텍스트: " + keywordMatcher.group());
}
위의 코드에서는 “지원”이라는 키워드가 포함된 텍스트를 추출합니다. 이렇게 정규 표현식으로 특정 단어 또는 문구가 포함된 데이터를 찾으면 데이터를 효율적으로 필터링할 수 있습니다.
불필요한 태그 제거 및 정리
크롤링한 HTML 문서에는 불필요한 태그가 포함되어 있어 데이터 분석에 방해가 되는 경우가 많습니다. JSoup는 remove() 메서드를 통해 특정 태그를 쉽게 제거할 수 있습니다. 예를 들어, 광고 태그나 스크립트 태그는 데이터 가공에서 필요 없으므로 제거하는 것이 좋습니다.
// 불필요한 태그 제거 예제
Element content = doc.selectFirst("div.content");
content.select("script, style, .ads").remove(); // 스크립트, 스타일, 광고 태그 제거
String cleanedText = content.text();
System.out.println("정리된 텍스트: " + cleanedText);
이 코드에서는 div.content 안에서 script, style, ads 클래스가 있는 태그를 제거하고 텍스트만 추출합니다. 이렇게 불필요한 태그를 제거해 필요한 데이터만 남길 수 있으며, 웹 페이지에 자주 포함되는 스크립트나 광고 태그를 필터링할 때 유용합니다.
또한, 반복적으로 사용되는 불필요한 HTML 구조가 있을 경우에도 이와 같은 방식으로 태그를 정리할 수 있습니다.
// 자주 사용되는 불필요한 태그 제거 예제
content.select("footer, header, .sidebar").remove(); // 푸터, 헤더, 사이드바 제거
System.out.println("필요한 내용만 남긴 텍스트: " + content.text());
이 예제는 푸터, 헤더, 사이드바와 같이 분석에 불필요한 HTML 구조를 제거하여 정제된 데이터만 남기고 원하는 정보만 추출합니다. 특히 뉴스 사이트나 블로그와 같은 구조화된 페이지에서 핵심 정보를 쉽게 뽑아낼 수 있습니다.
참고사이트
'JAVA' 카테고리의 다른 글
[JAVA] JSoup의 성능 최적화 (0) | 2024.10.29 |
---|---|
[JAVA] JSoup AJAX와 동적 페이지 처리 (0) | 2024.10.29 |
[JAVA] JSoup 에러 핸들링과 예외 처리 (0) | 2024.10.29 |
[JAVA] JSoup 데이터 전처리와 저장 (1) | 2024.10.28 |
[JAVA] JSoup HTML 데이터 추출 (0) | 2024.10.28 |
[JAVA] JSoup CSS 선택자 (0) | 2024.10.28 |
[JAVA] JSoup 기본 사용법 (0) | 2024.10.28 |
[JAVA] JSoup 라이브러리 추가 (Gradle, Maven) (1) | 2024.10.28 |