2012-07-06 2 views
1

텍스트 문서에서 토큰을 읽고 특정 키워드를 확인하고 싶습니다. 내가 어떻게 그럴 수 있니? 예를 들어 내 파일은 다음과 같습니다 :파이썬에서 토큰 읽기

<protein id="Q11" name="HUMAN" length="655" crc64="30E1C1D138"> 
    <match id="G3DSA:3.30.160.60" name="ZC2f_H2/iegse_NA-bd" dbname="GE3D" status="T" evd="HMPfm"> 
     <ipr id="IPR013087" name="Zinc finger, H2-type/inrase, D-bindg" tpe="Dain" /> 
     <ln stt="114" end="142" sc="1.0E-8" /> 
    </match> 

(내가 첫 번째 줄을 건너 뛰고 GE3D 동일해야합니다 DBNAME을 두 번째 줄에 토큰을 검색하려면이 경우 나는 STT 번호를 저장할. .과 끝 번호)

* 그래서 내가 이런 짓을하지만, 그것은 단지가 될 요구 사항을 만족해야 하나 이상의 수 있기 때문에, 시작과 끝 나에게 한 수를 반환 이유를 모르겠어요 : 를 LXML 가져 오기 연예

에서

파일 이름 = 'inQ14591.txt'

F 오픈 (파일 이름, 'RB')와

: 당신이 BeautifulSoup 그것을 구문 분석 할 수처럼

root = etree.parse(f) 
for ln in root.xpath("/protein/match[@dbname='GE3D']/ln"): 
    start = ln.get("stt") 
    end = ln.get("end") 

인쇄 (STT)

인쇄 끝

+3

무엇을 시도 했습니까? – 0605002

+3

XML처럼 보입니다. lxml을 사용하여 파서를 작성해 보았습니까? –

답변

0

보인다,하지만 난 모르겠어요 정확히 당신이 stt 값을 찾기 위해 귀하의 코멘트 당

from BeautifulSoup import BeautifulSoup 
text = '''<protein id="Q11" name="HUMAN" length="655" crc64="30E1C1D138"> 
    <match id="G3DSA:3.30.160.60" name="ZC2f_H2/iegse_NA-bd" dbname="GE3D" status="T" evd="HMPfm"> 
     <ipr id="IPR013087" name="Zinc finger, H2-type/inrase, D-bindg" tpe="Dain" /> 
     <ln stt="114" end="142" sc="1.0E-8" /> 
    </match>''' 

soup= BeautifulSoup(text) 

res=soup.findAll(dbname='GE3D') 

업데이트를 찾고, 당신은있는 라인을 찾을 필요다음과 같이 stt에 태그를 가지고 :

stt_value = soup.findAll('ln')[0]['stt'] # u'114' 
end_value = soup.findAll('ln')[0]['end'] # u'142' 
+0

TankorSmash 대단히 고마워요. 나는 이와 비슷한 여러 데이터를 가지고있다. 가능하다면 dbname = GE3D를 찾아 dbname = GE3D를 갖는 ln stt = "114"에서 142를 캡처하고 end = "142"에서 142를 캡처 할 수 있습니까? –

+0

확실히, 당신은'soup.findAll()'로 놀 필요가 있습니다. 여기에서 문서를보십시오'http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html#The 기본적인 발견 방법 : findAll (이름, attrs, 재귀, 원본, 한계, ** kwargs)' 그것은 당신이 그것의 걸림 새를 얻은 후 정말 간단합니다 – TankorSmash

+0

나는 당신의 방법을 사용하여 시도했지만 stt_value ... 및 end_value를 추가 할 때 인덱스가 범위를 벗어났습니다. –

1

이, 당신은 당신의 이점에 그것을 사용할 수있는 XML처럼 많이 보인다.

from lxml import etree 

filename = "somefilename" # change this 

with open(filename, 'rb') as f: 
    root = etree.parse(f) 
    for ln in root.xpath("/protein/match[@dbname='GE3D']/ln"): 
     stt = ln.get("stt") 
     end = ln.get("end") 
     print "%s, %s" % (stt, end,) 
     # do something else with stt and end 
+0

대단히 감사합니다. 이게 dbname = GE3D 인 텍스트 부분에서 stt와 end number를 얻을 수있게 할 것입니까? 내가 묻는 이유는 내가 dbname = 'GE3D'와 함께 하나의 파일에 위와 같은 여러 유사한 텍스트를 가지고 있다는 것입니다. 다시 감사합니다. –

+0

@ChadD : "텍스트"(대부분) 유효한 XML 인 한. 루프는'dbname'이'GE3D' 인 모든'match' 태그를 반복합니다. – cha0site

+0

나는 그것을 시험해보고 숫자의 목록을 출력하는지 보았으나 대신에 시작을위한 하나의 번호와 끝을위한 하나의 번호 만 출력한다. (그냥 stt를 추가하고 코드 아래에 인쇄 끝내기.) 감사합니다. –

관련 문제