2014-10-29 82 views
-2

所以,比如我有XML文檔:如何解析XML與LXML

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

我怎麼解析裏面B的所有文本。我將整個文件讀入一個字符串。 我只知道如何解析html,嘗試將它應用於html,但失敗了。

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

但它不會工作。

+0

什麼是「行不通」的意思嗎?你得到一個錯誤或空白的結果? – ErlVolton 2014-10-29 14:50:55

+1

您是否閱讀過'lxml'文檔?無論如何,爲什麼要使用HTML解析器? – 2014-10-29 14:51:17

+0

是的,我得到空字符串。我不明白xml部分的文檔。這很混亂。 – Dancia 2014-10-29 14:51:19

回答

1

您應該做的第一件事是確保您的xml文件爲lxml格式正確。如果整個文檔不包含在整個「body」標籤中,則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()方法就像一個迭代器,所以我們可以使用list comprehension將元素對象保存在列表中。從這裏我們可以編輯的B標籤之間的文本:

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 

最終的輸出應該是這個樣子:

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