2017-11-22 8 views
0

ElementTree를 사용하여 XML 파일을 구문 분석하려고하고 있으며 일부 지점에서 태그 안에있는 모든 자식 대신 첫 번째 자식 만 가져옵니다. 다음은 XML 구조입니다. -ElementTree를 사용하여 XML 태그에서 모든 자식 가져 오기

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <sentences> 
     <sentence id="2339"> 
      <text>I charge it at night and skip taking the cord with me because of the good battery life.</text> 
      <aspectTerms> 
       <aspectTerm term="cord" polarity="neutral" from="41" to="45"/> 
       <aspectTerm term="battery life" polarity="positive" from="74" to="86"/> 
      </aspectTerms> 
     </sentence> 
     <sentence id="812"> 
      <text>I bought a HP Pavilion DV4-1222nr laptop and have had so many problems with the computer.</text> 
     </sentence> 
     <sentence id="1316"> 
      <text>The tech guy then said the service center does not do 1-to-1 exchange and I have to direct my concern to the "sales" team, which is the retail shop which I bought my netbook from.</text> 
      <aspectTerms> 
       <aspectTerm term="service center" polarity="negative" from="27" to="41"/> 
       <aspectTerm term="&quot;sales&quot; team" polarity="negative" from="109" to="121"/> 
       <aspectTerm term="tech guy" polarity="neutral" from="4" to="12"/> 
      </aspectTerms> 
     </sentence> 
    </sentences> 

각 'aspectTerm'태그에서 '용어'를 가져오고 싶습니다.

import xml.etree.ElementTree as ET 
    tree = ET.parse('Laptops_Train.xml') 
    root = tree.getroot() 
    df = pd.DataFrame() 

    def getAspect(sentences): 
     reviewList = [] 
     text = sentence.find('text').text 
     reviewList.append(text) 
     for aspectTerms in sentence.iter('aspectTerms'): 
      #for aspectTerm in aspectTerms.iter('aspectTerm'): 
      aspect = aspectTerms.find('aspectTerm').get('term') 
      print(aspect) 
      return aspect 

    aspectList = [] 
    for sentences in root.iter('sentences'): 
     for sentence in sentences.iter('sentence'): 
      aspectList.append(getAspect(sentence)) 

실제 결과 :

cord 
class 'NoneType' 
service center 

예상 결과 : 사전에

[cord, battery life] 
[] 
[service center,&quot;sales&quot; team, tech guy] 

감사

답변

1

이것은을 사용하여 할 일이 많이 쉬워입니다 - : 그 내 코드는 다음과 xpath가있는 lxml 라이브러리.

>>> from lxml import etree 
>>> tree = etree.parse('Laptops_Train.xml') 
>>> for aspectTerms in tree.xpath('.//aspectTerms'): 
...  aspectTerms.xpath('aspectTerm/@term') 
... 
['cord', 'battery life'] 
['service center', '"sales" team', 'tech guy'] 

공지 사항도 모두 aspectTermsTerm 속성을 가지고; None을 발생시키는 빈 항목이 없습니다.

댓글에 의해 영감을 얻은 편집.

>>> from lxml import etree 
>>> tree = etree.parse('Laptops_Train.xml') 
>>> for sentence in tree.xpath('.//sentence'): 
...  sentence.xpath('.//aspectTerm/@term') 
... 
['cord', 'battery life'] 
[] 
['service center', '"sales" team', 'tech guy'] 
+0

답장을 보내 주셔서 감사합니다. 귀하의 솔루션을 훨씬 쉽게 있지만 aspectTerm 태그가없는 경우 빈 문자열을 삽입해야합니다. 그러나 의심의 여지 없이이 일을하는 당신의 방법은 훨씬 쉽습니다하지만 내 요구 사항을 충족하지 않습니다 –

+1

이제 나는 이해한다고 생각합니다. 편집을 참조하십시오. –

1

그래서 해결책은 .find 대신 .findall을 사용하는 것이 었습니다. '.findall'은 모든 자식을 선택하기 때문입니다. 내 솔루션은 다음과 같습니다 : -

def getAspect(sentences): 
     aspectList = [] 
     reviewList = [] 
     text = sentence.find('text').text 
     reviewList.append(text) 
     for aspectTerms in sentence.iter('aspectTerms'): 
      #for aspectTerm in aspectTerms.iter('aspectTerm'): 
      aspect = aspectTerms.findall('aspectTerm')#.get('term') 
      for aspectElem in aspect: 
       aspects = aspectElem.get('term') 
       aspectList.append(aspects) 
       print(aspects) 
     return aspectList 


    aspectList = [] 
    for sentences in root.iter('sentences'): 
     for sentence in sentences.iter('sentence'): 
      aspectList.append(getAspect(sentence))