티스토리 뷰

출처 : http://blog.naver.com/nlp1/150038573673

xml 형식의 데이터가 있을 때 원하는 태그의 데이터나 애트리뷰트의 데이터를 얻는 방법

text='''
<?xml version="1.0" encoding="UTF-8"?>
<corpus>
    <sentence id="11">
        <eojeol id="11-1">
            <e>경제의</e>
            <m>경제 의</m>
        </eojeol>
        <eojeol id="11-2">
            <e>나라는</e>
            <m>나라 는</m>
        </eojeol>
    </sentence>
<corpus>
'''

위와 같은 xml 형식의 문자열이 있을 경우
xml.dom.minidom을 이용하여 간단하게 파싱을 할 수 있다.

 

⇒ minidom을 import

 >>> from xml.dom import minidom

 

 ⇒ 문자열을 xml 파싱이 가능한 형식으로 변형

 >>> xmlraw = minidom.parseString(text)
>>> xmlraw
<xml.dom.minidom.Document instance at 0xb7bedc8c>

 

⇒ <sentence> tag 부분에 대해서 파싱

>>> sentenceList = xmlraw.getElementsByTagName('sentence'

>>> sentenceList

[<DOM Element: s at 0xb7bedf6c>]


⇒ <sentence> tag 부분으로 나누어진 리스트로 반환되며 인덱스(0, 1, 2, ...)로 접근 가능

    ※ toxml() 은 문자열로 반환

>>> sentenceList[0].toxml()

    <sentence id="11">

        <eojeol id="11-1">
            <e>경제의</e>
            <m>경제 의</m>
        </eojeol>
        <eojeol id="11-2">
            <e>나라는</e>
            <m>나라 는</m>
        </eojeol>
    </sentence>

 


⇒ 이후 재귀적으로 내부 파싱 가능, <eojeol> → <e>

>>> eojeol = sentenceList[0].getElementsByTagName('eojeol')

>>> e = eojeol[0].getElementsByTagName('e')

>>> e[0].toxml()

<e>경제의</e>

>>> e[1].toxml()

<e>나라는</e>

 
※ 현재는 예를 들기 위해 짧은 xml을 사용했기 때문에 하나씩의 태그를 포함하지만 같은 태그로 일정하게 반복되는 태그에 대해 모두 접근할 수 있다. 파싱되면 리스트 형태로 반환되기 때문에 예제처럼 하나의 태그만이 있더라도 인덱스를 사용하여 접근해야 한다.

 

⇒ 태의 안의 데이터를 얻는 방법

    '<e>경제의</e>' 의 경제의 만을 얻고자 할 경우 다음과 같은 함수를 사용한다.

>>> e[0].firstChild.data

경제의

>>> e[1].firstChild.data

나라는

 
 ⇒ 태그에 포함된 특정 attribute의 값을 얻는 방법
    예제에서 <sentence>에 대해 파싱된 데이터의 id라는 attribute 값을 가져오기 위해 다음과 같은 함수를 사용한다.

>>> sentenceList[0].getAttribute('id')

11

>>> eojeol[0].getAttribute('id')

11-1

 
⇒ example

from xml.dom import minidom

test='''<?xml version="1.0" encoding="UTF-8"?>
<corpus>
    <sentence id="11">
        <eojeol>
            <e>경제의</e>
            <m>경제 의</m>
            <t>NNG JKG</t>
        </eojeol>
        <eojeol>
            <e>나라는</e>
            <m>나라 는</m>
            <t>NNG JKG</t>
        </eojeol>
    </sentence>
    <sentence id="12">
        <eojeol>
            <e>경제의</e>
            <m>경제 의</m>
            <t>NNG JKG</t>
        </eojeol>
        <eojeol>
            <e>나라는</e>
            <m>나라 는</m>
            <t>NNG JKG</t>
        </eojeol>
    </sentence>
</corpus>
'''

xmlraw = minidom.parseString(test)


sentences = xmlraw.getElementsByTagName('sentence')

for sentence in sentences:
    print sentence.getAttribute('id')
    
    eojeols = sentence.getElementsByTagName('eojeol')
   

    eojeolSize = len(eojeols)
    for index in range(eojeolSize):
        mphms = eojeols[index].getElementsByTagName('m')
        print mphms[0].firstChild.data

 

11

경제 의

나라 는

12

경제 의

나라 는


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함