본문 바로가기
프로그래밍/Java

HTML에서 데이터 추출

by Mr-후 2019. 1. 2.
반응형


크롤링 핵심 가이드라는 책을 읽으면서 크롤링된 데이터에서 필요한 정보를 추출하는 '스크레이핑'에 대해 추출 방법을 정리해 본다. 


정규표현식 

html내부의 모든 a태그를 추출 하는 표현식 

<a.*>.*?</a> 


자바의  java.util.regex.Pattern클래스로 정규 표현식을 사용할 수 있다. 


String html = .... 

//a 태그를 추출하기 위한 정규 표현 

Pattern regex = Patten.compile("<a.*>.*?</a>"); 

//Matcher 객체 생성 

Matcher matcher = regex.matcher(html); 

//정규표현식에 일치하는 부분은 콘솔에 출력 

while(matcher.find()) {

System.out.println(matcher.group());

}


XPath 

XPath는 XML의 특정 요소를 추출하기 위한 쿼리를 의미한다. XML의 계층 구조를 경로로 표현해 추출할 요소를 지정할 때 사용. 

XML예

<?xml version="1.0" ?>

<books>

<book>

<title>크롤링</title>

<publisher>위키북스</publisher> 

</book>

....

</books>

타이틀이 '크롤링' 인 책을 낸 출판사를 추출 

/books/book[title/text()='크롤링']/publisher 


xml파일을 읽는다. 

DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); 
Document doc = documentBuilder.parse(new File("books.xml")); 

//XPath 사용 준비를 합니다. 

XPathFactory xpathFactory = XPathFactory.newInstance(); 
XPath xpath = xpathFactory.newXPath(); 

//publisher 요소를 추출하기 위한 XPath를 생성

XPathExpression expr = xpath.comile("/books/book[title/text()='크롤링']/publisher"); 

//publisher 요소를 추출하기 위한 XPath를 생성 

Object result = expr.evaluate(doc, XPathConstants.NODE);
Element element = (Element)result;
System.out.println(element.getTextContent()); 


CSS선택자 

CSS란 Cascading Style Sheets의 약자로 HTML, XHTML, XML과 같은 마크업 문서의 외관을 표현할 때 사용하는 형식이며 HTML은 문서의 구조를 표현할 때 사용하는 것이고 CSS는 그러한 문서의 외관을 표현할 때 사용하는 것이라고 구분하면 좋다. 현재 CSS3까지 권고된 상태. 

h1 {

font-size:180%;
color:red;

}

div.content {

padding:10px;
color:gray;

}


CSS선택자는 a처럼 단순하게 요소를 선택하는 것도 있고, div > a (div 요소 바로 아래에 있는 a요소)처럼 부모 자식 관계를 선택하는 것도 있다. 

다양한 선택자가 있는데 우선 기본적인 선택자는 다음과 같다. 


* : 모든 요소를 선택, 전체 선택자, 유니버셜 선택자라고 하는데 참고로 #id는 *#id, *.not(selector)는 :not(selector)와 같은 의미다. 

E : 요소를 나타낸다. (예 : div ) 

#id : id속성을 지정. (예 : #content ) 

.class : class속성을 지정. .contents.detail-a 처럼 결합하면 여러 개의 class속성을 지정할 수 있다. (예 .article ) 


결합자

E F : E의 후손에 있는 F를 나타낸다. (예: div.labels span) 

E > F : E의 자식에 있는 F를 나타낸다. (예: ul#content-list > li ) 

E + F : E와 이웃한 F를 나타낸다. (예: li.active + li)

E ~ F : E 뒤에 있는 F를 나타낸다. (예: h1 ~ div) 


이 외에도 속성선택자, 유스 클래스 선택자 등이 있다. 자바 언어를 사용해 크롤링을 하고 스크레이핑을 할때에는 경험상 Jsoup이라는 라이브러리를 사용하는 것이 가장 바람직해 보인다. 다양한 선택자를 사용할 수 있고 유연하고 사용 방법도 직관적이다. 


따라서 베이스가 되는 기본 개념은 HTML + CSS , DOM에 대한 학습을 한 수 HTML을 크롤링해서 데이터를 추출하는 기술은 경험적으로 습득하면 될 것 같다. 




반응형