2014-10-29 4 views
-2

와 XML을 구문 분석하는 방법 : 나는 B 형의 내부의 모든 텍스트를 구문 분석 할 방법그래서 예를 들어 내가 XML의 문서가 LXML

<?xml version="1.0"?> 
<a> 
    <b>Text I need</b> 
</a> 
<a> 
    <b>Text I need2</b> 
</a> 

합니다. 내 전체 파일을 문자열로 읽었습니다. html을 구문 분석하는 방법 만 알고 html에 적용하려고했지만 실패했습니다.

from lxml import html 
string = myfile.read(); 
tree = html.fromstring(string); 
result = tree.xpath('//a/@b'); 

하지만 작동하지 않습니다.

+0

은 무엇 "작동하지 않습니다"않습니다 의미? 오류가 발생하거나 결과가 비어 있습니까? – ErlVolton

+1

'lxml' 문서를 읽었습니까? 어쨌든 XML이있는 경우 HTML 구문 분석기를 사용해야하는 이유는 무엇입니까? –

+0

예, 빈 문자열이 나옵니다. 나는 xml 부분에 대한 설명서를 이해하지 못했습니다. 혼란 스러웠습니다. – Dancia

답변

1

먼저해야 할 일은 XML 파일의 형식이 lxml인지 확인하는 것입니다. 전체 문서가 전체 "본문"태그 내에 포함되어 있지 않으면 lxml 파서가 실패합니다. 이 제안을 할 수 있습니다 :

<?xml version="1.0"?> 
<body> 
    <a> 
    <b>Text I need</b> 
    </a> 
    <a> 
    <b>Text I need2</b> 
    </a> 
</body> 

이 파일을 "foo.xml"이라고합니다. 이제이 데이터 형식은 lxml이 라이브러리의 구문 분석, 수입 etree 더 나은 것을 :

from lxml import etree as et 

지금은 루트 오브젝트의 데이터를 분석하고 만들 수있는 시간이되는 시작하는 것입니다 :

file_name = r"C:\foo.xml" 
xmlParse = et.parse(file_name) #Parse the xml file 
root = xmlParse.getroot() #Get the root 

번 루트 객체가 선언되었으므로 이제 getiterator() 메서드를 사용하여 모든 b 태그를 반복 할 수 있습니다. getiterator() 메서드는 반복자 인 것처럼 들리므로 목록 이해를 사용하여 요소 개체를 목록에 저장할 수 있습니다.

bTags = [tag for tag in root.getiterator("b")] #List comprehension with the iterator 
bTags[0].text = "Change b tag 1." #Change tag from "Text I need" 
bTags[1].text = "Change b tag 2." #Change tag from "Text I need2" 
xmlParse.write(file_name) #Edit original xml file 

최종 출력 이런 식으로 뭔가 보일 것입니다 : 우리는 B 태그 사이에있는 텍스트 편집 할 수 있습니다 거기에서

<?xml version="1.0"?> 
<body> 
    <a> 
    <b>Change b tag 1.</b> 
    </a> 
    <a> 
    <b>Change b tag 2.</b> 
    </a> 
</body>