[Oracle] 문자열에서 HTML 태그 값 추출 방법

오라클에서 HTML 문자열 내부의 특정 태그 값을 추출하기 위해서는 정규식 함수를 사용하면 쉽게 해결된다. 정규식 함수는 Oracle 10g 이상에서 사용할 수 있으며, Oracle 11g 이상에서는 XMLTYPE 함수를 사용하여 문자열에서 태그 값을 추출할 수 있다. XMLTYPE 함수는 사용하기는 편하지만 특정 패터만 추출이 가능하며, 조금 더 세밀한 태그 값을 추출하기 위해서는 정규식 함수(REGEXP_SUBSTR)를 사용하면 된다.

 

목차
  1. REGEXP_SUBSTR 함수를 사용하여 태그 값 추출
  2. XMLTYPE 함수를 사용하여 태그 값 추출

 

REGEXP_SUBSTR 함수를 사용하여 태그 값 추출

정규식을 사용하여 문자열에서 태그 값  추출 (Oracle 10g 이상)

WITH temp AS (
  SELECT '<html>'
      || '  <head>'
      || '    <title>This is Title</title>'
      || '  </head>'
      || '  <body>'
      || '    <h1>This is heading</h1>'      
      || '    <p>This is Paragraph 1</p>'
      || '    <p>This is Paragraph 2</p>' 
      || '  </body>'
      || '</html>' AS html_string
    FROM dual
)

SELECT REGEXP_SUBSTR(html_string, '<h1>.*?</h1>') AS tag_val
  FROM temp

 

 

REGEXP_SUBSTR 정규식 함수를 사용하여 HTML 문자열에서 H1 태그 값을 추출하는 예제이다.

H1 태그가 여러 개 있을 경우 첫 번째 태그만 추출된다.

 

태그는 제외하고  내부 문자열만 추출 (Oracle 11g 이상)

WITH temp AS (
  SELECT '<html>'
      || '  <head>'
      || '    <title>This is Title</title>'
      || '  </head>'
      || '  <body>'
      || '    <h1>This is heading</h1>'      
      || '    <p>This is Paragraph 1</p>'
      || '    <p>This is Paragraph 2</p>' 
      || '  </body>'
      || '</html>' AS html_string
    FROM dual
)

SELECT REGEXP_SUBSTR(html_string, '(<h1>)(.*?)(</h1>)', 1, 1, 'i', 2) AS tag_val
  FROM temp

 

 

오라클 11g부터 REGEXP_SUBSTR 함수에서 사용할 수 있는 기능이 추가되어서 태그(H1)는 제외하고 태그 내부의 문자열만 추출할 수 있다.

 

REGEXP_SUBSTR('문자열', '정규표현식', '시작위치', '추출순번', '대소문자구분', '출력할정규식그룹(괄호)순번')

 

동일한 태그가 여러 개 있을 경우 연속으로 추출 (Oracle 11g 이상)

WITH temp AS (
  SELECT '<html>'
      || '  <head>'
      || '    <title>This is Title</title>'
      || '  </head>'
      || '  <body>'
      || '    <h1>This is heading</h1>'      
      || '    <p>This is Paragraph 1</p>'
      || '    <p>This is Paragraph 2</p>' 
      || '  </body>'
      || '</html>' AS html_string
    FROM dual
)

 SELECT REGEXP_SUBSTR(html_string, '(<p>)(.*?)(</p>)', 1, LEVEL, 'i', 2) AS tag_val
   FROM temp
CONNECT BY LEVEL <= REGEXP_COUNT(html_string, '(<p>)(.*?)(</p>)', 1, 'i')

 

 

문자열에서 동일한 태그(P)가 여러 개 있을 경우 CONNECT BY를 사용하여 연속해서 태그 값을 추출할 수 있다.

REGEXP_COUNT 함수는 오라클 11g 이상에서 사용 가능하다.

 

XMLTYPE 함수를 사용하여 태그 값 추출

문자열에서 동일한 태그가 한 개만 있을 경우 (Oracle 11g 이상)

WITH temp AS (
  SELECT '<html>'
      || '  <head>'
      || '    <title>This is Title</title>'
      || '  </head>'
      || '  <body>'
      || '    <h1>This is heading</h1>'      
      || '    <p>This is Paragraph 1</p>'
      || '    <p>This is Paragraph 2</p>' 
      || '  </body>'
      || '</html>' AS html_string
    FROM dual
)

SELECT XMLTYPE(html_string).EXTRACT('/html/body/h1/text()').GETSTRINGVAL() AS tag_val 
  FROM temp

 

 

XMLTYPE 함수를 사용하여 특정 태그(H1) 값을 추출할 수 있다. (태그의 대소문자 구분함)

오라클 11g 이상에서 사용 가능하다.

 

태그 내부에 새로운 태그가 존재한다면 정상적으로 추출되지 않는다. (예, <h1>This is <b>heading</b></h1>)

B태그는 제외한 This is만 반환된다.

 

문자열에서 동일한 태그가 여러 개 있을 경우 (Oracle 11g 이상)

WITH temp AS (
  SELECT '<html>'
      || '  <head>'
      || '    <title>This is Title</title>'
      || '  </head>'
      || '  <body>'
      || '    <h1>This is heading</h1>'      
      || '    <p>This is Paragraph 1</p>'
      || '    <p>This is Paragraph 2</p>' 
      || '  </body>'
      || '</html>' AS html_string
    FROM dual
)

SELECT XMLTYPE(html_string).EXTRACT('/html/body/p/text()').GETSTRINGVAL() AS tag_val 
  FROM temp

 

 

문자열에서 동일한 태그(P)가 여러 개 있을 경우 태그 내부의 문자열만 추출한 후 하나의 문자열로 반환한다.

 

 

댓글

Designed by JB FACTORY