2014-12-29 2 views
-1

XML 문서에서 특정 태그의 텍스트 오프셋을 찾는 데 도움이 필요합니다. 각 레코드에 TEXT 요소가 하나만 포함되어 있지만 ROOT 요소에 여러 레코드가 들어있는 아래 그림과 같은 형식의 데이터 세트가 있습니다. 텍스트에는 일부 텍스트의 주석으로 사용되는 여러 TAG 요소가있을 수 있습니다. 이 주석을 파이썬을 사용하여 태그의 시작과 끝 오프셋을 필요로하는 다른 형식으로 변환해야합니다.Python을 사용하여 XML 문서에서 태그 오프셋을 추출하는 방법 BeautifulSoup

<ROOT> 
    <RECORD ID="123"> 
     <TEXT> 
     This is an example text written at <TAG TYPE="DATE">December 29th</TAG> to illustrate the problem. 
     </TEXT> 
    </RECORD> 
</ROOT> 

기본적으로, 나는 다음과 같은 형식으로 형식보다 변환하고 싶습니다 : 내가 BeautifulSoup로 사용하여 시도했지만 태그 오프셋을 추출하는 방법을 찾을 수 없습니다

<ROOT> 
    <RECORD ID="123"> 
     <TEXT> 
     This is an example text written at December 29th to illustrate the problem. 
     </TEXT> 
     <TAG TYPE="DATE" BEGIN=36 END=49/> 
    </RECORD> 
</ROOT> 

. 누구 아이디어?

도움 주시면 감사하겠습니다.

/야콥

lxml.etree으로
+0

왜 이것을 다운 그레이드 했습니까? – ShreevatsaR

답변

1
아이디어 '는 TEXT 내부의 텍스트'각 TAG의 위치를, 내부의 모든 TAG 노드를 찾아, 모든 TEXT 노드를 반복 얻을 수 있습니다

RECORD 수준의 텍스트와 create new tag 다음 unwrap()TAGTEXT에서 :

from bs4 import BeautifulSoup 

data = """ 
<ROOT> 
    <RECORD ID="123"> 
     <TEXT> 
This is an example text written at <TAG TYPE="DATE">December 29th</TAG> to illustrate the problem. 
     </TEXT> 
    </RECORD> 
</ROOT> 
""" 

soup = BeautifulSoup(data, "xml") 

for text in soup.find_all('TEXT'): 

    record = text.parent 
    for tag in text.find_all('TAG'): 
     begin = text.text.index(tag.text) 
     end = len(tag.text) + begin 

     record.append(soup.new_tag(tag.name, BEGIN=begin, END=end)) 

     tag.unwrap() 

print soup 

인쇄 :

<?xml version="1.0" encoding="utf-8"?> 
<ROOT> 
<RECORD ID="123"> 
<TEXT> 
This is an example text written at December 29th to illustrate the problem. 
     </TEXT> 
<TAG BEGIN="36" END="49"/></RECORD> 
</ROOT> 

참고 : 여러 TAG s는 TEXT 수준에 표시되는 경우를 테스트하지 않았습니다. 그러나 적어도 그것은 당신에게 출발점을 제공해야합니다.

+0

답변을 주셔서 감사합니다. 여러 태그에 동일한 내용이 있지만 문제를 해결할 수는 있지만 문제가 있습니다. – jaxah

+0

이것은 매우 영리한 해킹입니다. 아이디어를 가져 주셔서 감사합니다. – ShreevatsaR

0

from lxml import etree 
root = etree.fromstring(data) 
insert_tag = etree.Element("TAG") 
insert_t_attib = insert_tag.attrib 
insert_t_attib["TYPE"] = "DATE" 

for i in root.getiterator("TAG"): 
    tag_text = i.text.strip() 
    p = i.getparent() 
    etree.strip_tags(p, "TAG") 
    pp = p.getparent() 
    p_text = p.text.strip() 
    begin = p_text.find(tag_text) 
    end = begin + len(tag_text) 
    insert_t_attib = insert_tag.attrib 
    insert_t_attib["BEGIN"] = str(begin) 
    insert_t_attib["END"] = str(end) 

    pp.insert(pp.getchildren().index(p)+1, insert_tag) 


print etree.tostring(root) 

<ROOT> 
    <RECORD ID="123"> 
     <TEXT> 
     This is an example text written at December 29th to illustrate the problem. 
     </TEXT> 
    <TAG TYPE="DATE" BEGIN="35" END="48"/></RECORD> 
</ROOT> 
+0

태그 태그의 시작 및 끝 값을 가져 오도록 편집되었습니다. –

관련 문제