ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 웹 데이터 요청하고 xpath로 데이터 추출하기
    F# 2015. 12. 26. 22:33

    이번 시간에는 F#을 이용하여 Web 데이터를 요청하고, xpath로 데이터를 추출하는 방법에 대해서 알아봅니다.


    일반적으로 html 문서에서 데이터를 추출하기 위해서는 정규식을 이용하여 파싱하여야 합니다.

    이때 여러 위치에 있는 데이터를 추출하거나, 반복되는 데이터를 추출해야하는 경우가 많은데

    각 경우에 대해 모두 정규식을 이용하여 처리하는것은 여간 번거로운 작업이 아닐 수 없습니다.


    xpath는 xml 문서의 데이터 위치를 url과 비슷한 형태로 지정하여 조회 할 수 있는 기술입니다.

    이를 이용하면 데이터 추출을 매우 간단하고 직관적으로 처리 할 수 있습니다. 

    문제는, html 문서는 잘 정의된 xml 문서가 아니므로, xpath를 사용 할 수가 없었습니다. 

    이 문제를 해결하기위해 나온 라이브러리가 바로 Html agility pack 입니다.


    1.  url을 이용하여 html 데이터 얻기

    open System.Net

    :

    let LoadHtml(url : string ) =

    let webClient = new WebClient()

    let htmlDoc = webClient.DownloadString(url)

    htmlDoc

    주의: HtmlAgilityPack 내부의 html download 함수는 테스트결과 encoding 처리에 문제를 가지고 있습니다. 

    encoding을 지정하여도 utf8이 깨지는 경우가 발생합니다. 이에 WebClient 객체를 사용하여 로딩합니다.



    2. HtmlAgilityPack 라이브러리를 설치 

    HtmlAgilityPack은 html 문서에 xpath를 사용 할 수 있도록 파싱해줍니다.

    비주얼스튜디오 패키지 관리자 NuGet을 이용하여 설치를 진행합니다.


    Project 명이나, References 에 대고 오른쪽 버튼을 누른다.


    검색창에 html agility pack 을 입력해준다.


    3. xpath 를 지정하여, html 노드의 데이터를 추출합니다.

    open HtmlAgilityPack

    :

    let ExtractContext htmlDoc =

    let hap = new HtmlAgilityPack.HtmlDocument()

    hap.LoadHtml(htmlDoc)

    let nodes = hap.DocumentNode.SelectNodes("//*[@id=\"content\"]/div[2]/table[1]/tbody/tr")

    for node in nodes do

    : (노드마다 돌면서 처리할일)


    SelectSingleNode 함수와 SelectNodes 함수를 통해 데이터 또는 데이터셋을 얻을 수 있습니다.

    주소 문자열 맨 앞의 //는 root node 부터 찾으라는 의미이며, 앞에 점을 붙여 './/' 로 지정하면

    현재 노드부터 찾으라는 의미가 됩니다. 

    (이와 관련한 자세한 내용은 xpath 정의를 검색하여 보기 바랍니다.)


    4. 추출 데이터의 xpath 주소 쉽게 만들기


    위와 같이 크롬 브라우져의 요소 검사를 이용하면 추출하고자 하는 데이터의 xpath 주소를 쉽게 얻을 수 있습니다.

    주의 할점은 주소를 잘 지정해도 데이터가 넘어오지 않는 경우가 있는데 이때는, 주소를 최상위 부모노드부터 

    차례차례 추가로 지정하여 어떤 노드를 조회하는데 실패했는지 찾아보시기 바랍니다.

    (예: //aa/bb/cc -> //aa만 지정해보고 노드리턴 체크 -> //aa/bb 지정해보고 노드리턴 체크)



    'F#' 카테고리의 다른 글

    F# 타이머 예제  (0) 2016.03.11
    F# Async Task 예제  (0) 2016.03.11
    F# 에서 쓰레드 사용하기 예제  (0) 2016.03.11
    60초안에 살펴보는 F# 문법  (0) 2015.12.05
    함수형 언어 F# Hello world  (0) 2015.12.04
Designed by Tistory.