2011-10-29 3 views
8

* 참고 : lxml은 내 시스템에서 실행되지 않습니다. 나는 lxml을 포함하지 않는 해결책을 찾기를 희망했다.Python XML 구문 분석

나는 이미 여기에서 몇 가지 문서를 읽었으며이 작업을 수행하는 데 어려움을 겪고 있습니다. 나는이처럼 보이는 일부 XML 파일을 구문 분석하고 싶습니다 : 내가 조작을 시도하고있는 파일에서

<dict> 
    <key>1375</key> 
    <dict> 
     <key>Key 1</key><integer>1375</integer> 
     <key>Key 2</key><string>Some String</string> 
     <key>Key 3</key><string>Another string</string> 
     <key>Key 4</key><string>Yet another string</string> 
     <key>Key 5</key><string>Strings anyone?</string> 
    </dict> 
</dict> 

을,이에 따라 더 '딕셔너리'가있다. XML을 읽고 다음과 같은 텍스트/dat 파일을 출력하고 싶습니다.

1375, "Some String", "Another String", "Another string", "Strings anyone?"

...

** 원래

Eof는, 내가 LXML을 사용하려고하지만, 많은 시도가 내 시스템에 작업을 진행 한 후, 나는 DOM을 사용하여에 옮겼습니다. 최근에, Etree를 사용하여이 작업을 시도했습니다. 제발, 좋은 모든 것에 대한 사랑 때문에 누군가가 이것과 함께 나를 도울까요? 필자는 Python을 처음 접했을 때 어떻게 작동하는지 배우고 싶습니다. 미리 감사드립니다.

+1

어떤 OS 및 버전의 Python입니까? – Acorn

+0

번호 1375가 두 번 있습니다. 이 두 숫자가 다를 수 있습니까? 그렇다면 어떤 것을 원하십니까? –

답변

10

파이썬에 포함 된 xml.etree.ElementTree을 사용할 수 있습니다. 포함 된 컴패니언 C 구현 (즉, 훨씬 빠름) xml.etree.cElementTree이 있습니다. lxml.etree은 기능의 수퍼 세트를 제공하지만 원하는 작업에는 필요하지 않습니다. @Acorn에서 제공

코드는 다음과 수입의 각각의 날 (파이썬 2.7, 윈도우 7)에 대해 동일하게 작동합니다

import xml.etree.ElementTree as et 
import xml.etree.cElementTree as et 
import lxml.etree as et 
... 
tree = et.fromstring(xmltext) 
... 

당신이 사용하는 어떤 설치 문제는 당신이 lxml와 함께 있었 어떤 OS?

+0

Ubuntu Maverick Meerkat Netbook 설치를 사용하고 있습니다 ... 최신 lxml 설치시 터미널에이 메시지가 포함되어 있습니다. python-lxml의 압축 풀기 .../python-lxml_2 .2.6-1_i386.deb) ... firmware-b43-installer (4.150.10.5-4) 설정 ... 지원되지 않는 PCI ID 14e4 : 4315의 저전력 칩! 중단 중입니다. – PleaseHelpTheNewGuy

+0

난 그냥 코드와 새로운 수입을 시도하고이 오류를 가지고 : 등 ImportError를 같이 에, 수입 lxml.etree을 파일 "/home/worky.py", 5 호선 : 역 추적 (가장 최근 통화 마지막) 아니오 모듈 lxml.etree – PleaseHelpTheNewGuy

+0

(1) 당신의 우분투 설치 문제 : lxml 메일 링리스트를 사용해 보시길 권합니다. (2) "lxml.etree라는 모듈이 없습니다 ... 설치되어 있지 않기 때문입니다." 한 번에 하나의 가져 오기 만 활성화하십시오. 다른 두 명을 주석 처리하십시오. –

7
import xml.etree.ElementTree as et 
import csv 

xmltext = """ 
<dicts> 
    <key>1375</key> 
    <dict> 
     <key>Key 1</key><integer>1375</integer> 
     <key>Key 2</key><string>Some String</string> 
     <key>Key 3</key><string>Another string</string> 
     <key>Key 4</key><string>Yet another string</string> 
     <key>Key 5</key><string>Strings anyone?</string> 
    </dict> 
</dicts> 
""" 

f = open('output.txt', 'w') 

writer = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC) 

tree = et.fromstring(xmltext) 

# iterate over the dict elements 
for dict_el in tree.iterfind('dict'): 
    data = [] 
    # get the text contents of each non-key element 
    for el in dict_el: 
     if el.tag == 'string': 
      data.append(el.text) 
     # if it's an integer element convert to int so csv wont quote it 
     elif el.tag == 'integer': 
      data.append(int(el.text)) 
    writer.writerow(data) 
+0

너무 빨리 게시 해 주셔서 감사합니다. 문제는 lxml을 내 컴퓨터에서 실행할 수 없다는 것입니다. 저는 파이썬 2.7을 가지고 있고 그 모듈을 설치하려고 몇 번 시도했지만 실패했습니다. 나는 lxml을 포함하지 않는 또 다른 방법이 있기를 바랬다. – PleaseHelpTheNewGuy

+1

실행중인 OS는 무엇입니까? – Acorn

+0

우분투 매 버켓 Meerkat Netbook 에디션을 실행 중입니다 ... – PleaseHelpTheNewGuy