반응형

python을 이용한 xml 사이트 파싱 


인터넷 검색하면 죄다 xml  파일을 파싱하는 것만 나옵니다...

순간 저도 혹해서 xml 파일을 다운로드 받아서 저장하고 저장된 파일을 파싱하려고 했는데

너무 불필요한 IO가 일어나는게 싫었습니다..


근데 이게 참 안되네요..


처음엔

import requests

import xml.etree.ElementTree as elementTree


url = 'https://blabla..'

이렇게 받은 이후

elementTree.parse(url)

이렇게 하니 안됩니다.....

elementTree.parse에 들어가는 변수는 url이 아니라 filename 이랍니다.. 저장된 파일이름...


이제 다른 방버을 찾아봅니다..

docs를 찾아보니까 data일때는 elementTree.fromstring() 으로 변환을 시켜줘야 한다고 합니다.

root = elementTree.formstring(requests.get(url, verify=False).text)

이런 방식으로 requests.get 을 통해 웹페이지를 string 형태로 받아서 string 을 elementTree 형태로 변경해 줍니다.


여기서 또 2시간 정도 삽질을 했는데.. docs를 잘 안본 제 탓이죠.. ㅠㅠ

보면 2가지 방법으로 값을 가져올 수 있는데 하나는 [] 로, 하나는 find 같은 함수를 이용하는 방법이 나옵니다.


당연히 편한 find()나 findtext() 함수를 사용하였으나 안됩니다.. none을 반환하네요...

찾아보니 none 은 값을 못찾을때 return 한다고 합니다..


그래서 이번엔 배열 방식인 []로 찾아봅니다..


print(root[0][0].text) 이런식!!

잘찾아오네요..? -_-;;


도대체 왜 find 함수를 쓰면 안되는거냐!! 고 엄청나게 헤매던 그때..

docs 페이지를 더 아래로 내리니...

xpathpython xpath xml parse

이렇게 나오네요....

와.. 순간 화가 확.. ㅠㅠ

이걸 왜 못봤을까요...


string 형식을 elementTree 형태로 변환을 했기 때문에 당연히 find로 할 수 있는 줄 알았는데.. ㅠㅠ

XPATH 방식으로 처리가 가능합니다..


저렇게 find를 쓰되, parse()로 분석했을때는 해당 element 이름만 적으면 되는 반면

string을 변환하여 사용할때는 xpath 방식으로 find(.//element name) 형식으로 찾을 수 있습니다


결론. XPATH 형태로 호출하면 된다


반응형

+ Recent posts