R에서 인터넷 자료 불러오기 2

3 페이지 소스에서 내용 추출하기

3.1 정규표현식으로 추출하기

앞에서 GET이나 POST로 웹 페이지에 접근해 웹 페이지의 소스 코드를 얻었으나, 온갖 태그와 스크립트가 섞여 있어 현재 상태로는 데이터라고 부를 수 없습니다.

만일 원하는 데이터가 특정 형태를 갖고 있다면, 어떤 규칙을 정하고, 이 규칙을 만족하는 문자열만 추출해서 데이터를 얻어보도록 하겠습니다. 이 규칙을 정규표현식(정규식)이라고 합니다.

http://www.hani.co.kr/arti/society/area/780153.html

정규식을 이용해 뉴스 기사의 소스코드에서 이메일 주소를 추출해보도록 하겠습니다. 일반적으로 이메일 주소는 username@domain.aaa 또는 username@domain.bb.cc 이기 때문에 이를 이용해서 정규식을 작성해보겠습니다.

[뉴스 화면]

library(stringr)
get.result = GET("http://www.hani.co.kr/arti/society/area/780153.html")
str0 = as.character(get.result, )
links = str_extract_all(str0, "[0-9a-zA-Z_-]+@{1}[0-9a-zA-Z_-]+[.]{1}[a-zA-Z]+[.]?[a-zA-Z]*")[[1]]

[결과]

위와 같이 기자의 이메일을 추출하였습니다. 사족이지만 이런 방식의 이메일 수집을 막기 위해 홈페이지에 이메일 주소를 쓸 때 @를 at 등으로 쓰기도 합니다.

xpath로 데이터 수집하기

우리가 보는 인터넷 페이지들은 계층적인 구조로 되어있습니다. 비유하자면 페이지 전체는 하드디스크이고, 그 안에 폴더와 파일이 존재하여 내용을 가지고 있고, 웹 브라우저로 볼 때는 전체 내용을 펼쳐서 보여 주는 것입니다. 컴퓨터 하드 디스크의 파일을 경로로 찾아가듯이 (C:\windows\notepad.exe) 인터넷 페이지의 내용에 대한 노드의 경로를 지정한 것이 xpath입니다.

이런 구조는 아무 인터넷 페이지나 들어간 뒤 크롬 브라우저 기준으로 F12를 누르면 쉽게 확인할 수 있습니다. 주로 <head>, <body>, <div>, <table>, <p> 등의 구조로 이루어져 있을 것입니다.

xpath는 w3 재단(www, xml 표준 등을 관리하는)에서 제정한 표준이므로, 굳이 R이 아니더라도 다른 언어에서도 활용 가능합니다. 이 포스트의 내용은 w3에서 만들어놓은 [Tutorial(링크)](https://www.w3schools.com/xml/xpath_intro.asp] 의 예제를 R로 구현해본 것입니다.

[웹 사이트의 계층적 구조]

예제를 통해 R에서 xpath를 사용하는 방법을 알아보겠습니다.

<?xml version="1.0" encoding="UTF-8"?>

<bookstore>

<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>

<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>

<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>

<book category="web">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>

</bookstore>

간단한 예시를 들어보겠습니다. bookstore 노드 아래에 book 노드가 존재하고, book 노드에는 각각 title과 price 노드가 존재합니다. 이 구조를 계층적으로 표시하면 다음과 같습니다.

<와 > 안쪽의 내용에서 첫 부분은 노드의 이름이고, 나머지 부분은 속성입니다. 또한 <와 > 바깥 쪽의 내용은 텍스트 노드로 접근 가능합니다.