XML 다루기 (feat. python)

괴도소녀·2021년 7월 3일
0

python

목록 보기
4/11

XML은 Extensible Markup Language의 약자로, 다목적 마크업 언어이다.
필자가 처음에 봤을때 HTML과 같은 부류이지만 react에서 scss 조합으로 스타일 태그를 만들어서 이용하는 것과 매우 유사해 보였다.

인터넷 웹상에서 문서나 데이터를 교환할 때 마크업 언어를 사용한다.
나중에 공부하게 되겠지만 API에서 데이터를 request하고 response할때 XML, JSON 형식을 이용해 교환한다.

XML의 기본적인 뼈대는 아래와 같다.

<태그이름></태그이름>

XML의 특징이 있다면, 태그이름을 작성자가 마음대로 정할 수 있다는 점이다.

<Foodlist>
	<Storename>포폴로</Storename>
    <Storeaddress>일산동구</Storeaddress>
</Foodlist>

XML 파일 만들기

ElementTree

파이썬의 표준 library.

기능설명
Element()태그 생성
SubElement()자식 태그 생성
tag태그 이름
text텍스트 내용 생성
attrib속성 생성

dump()

만든 XML을 시스템(sys.stdout)에 사용한다.

  • write() : XML파일로 저장.
  • python의 list와 유사한 메소드들을 제공.
    - append, insert, remove, pop ...

[코드]

import xml.etree.ElementTree as ET

Item = ET.Element("Item")
Name = ET.Element("Name")
Address = ET.Element("Address")

Name.text = "피자집"
Address.text = "용산구"
Item.append(Name)
Item.append(Address)

ET.SubElement(Item, 'Number').text = "010-0000-0000"

ET.dump(Item)

[결과]

<Item>
<Name>피자집</Name>
<Address>용산구</Address>
<Number>010-0000-0000</Number>
</Item>

태그 속성

  • attrib : 속성값을 지정하는 method
  • 태그 이름은 tag 메소드를 이용하여 바꿀수 있다.

[코드]

Item.attrib["id"] = "store01"
Name.tag = "StoreName"
ET.dump(Item)

[결과]

<Item id="store01">
<StoreName>피자집</StoreName>
<Address>용산구</Address>
<Number>010-0000-0000</Number>
</Item>

특정 위치에 삽입하기

[코드]

category = ET.Element('category', indexnum="2")
category.text = '고깃집'
Item.insert(1,category)
ET.dump(Item)

[결과]

<Item id="store01">
<StoreName>피자집</StoreName>
<category indexnum="2">고깃집</category>
<Address>용산구</Address>
<Number>010-0000-0000</Number>
</Item>

태그 삭제하기

  • remove, pop
Item.remove(category)

xml파일로 저장하기

ET.ElementTree(Item).write('foodStoreList.xml')

XML parsing

위에선 본 ElementTree이 파싱 라이브러리의 첫번째고,
두번째는 BeautifulSoup이라는 라이브러리이다.

여기서 필요한 라이브러리는 2가지이다.

설치됬는지 확인해보는 작업도 습관을 들이는게 좋다.

pip list | grep beautifulsoup4
pip list | grep lxml

이제, 맛집 리스트 중에서 맛집 이름만 가져오고 싶다. => <StoreName>

from bs4 import BeautifulSoup
with open("/foodStoreList.xml", "r", encoding='utf8') as f:
    StoreListXml = f.read() 
 
# BeautifulSoup 객체를 생성. lxml parser을 이용하여 데이터를 분석한다.
soup = BeautifulSoup(StoreListXml,'lxml') 

# find_all() 함수로 StoreName 태그들 찾기
for storename in soup.find_all('StoreName'): 
    print(storename.get_text())

0개의 댓글