2015-03-02 53 views
2

我已經下面的XML文件的結構:蟒的XML:不合式(標記無效) - xml.etree UTF模式

<doc id="4611827073121129112"> 
<class name="tag:September_11" val="-0.079590" /> 
<class name="tag:Theater" val="-0.134223" /> 
<class name="tag:Adaptation" val="-0.106678" /> 
<class name="tag:Paranormal" val="-0.183504" /> 
<class name="tag:Magic" val="-0.179214" /> 
<class name="tag:Comedy_Drama" val="-0.044658" /> 
<class name="tag:Fashion" val="-0.280695" /> 
<class name="tag:Running" val="0.160316" /> 
<class name="tag:Construction" val="-0.072044" /> 
<class name="tag:Suspense_Thriller" val="-0.370302" /> 
<class name="tag:Space" val="-0.239723" /> 
<class name="tag:Police" val="-0.139019" /> 
<class name="tag:Hip-Hop_&_Rap_Music" val="-0.290353" /> 
<class name="tag:Surfing" val="-0.027105" /> 
<class name="tag:Halloween" val="-0.236606" /> 
<class name="tag:Mystery_&_Suspense" val="0.005384" /> 
<class name="tag:Educational" val="-0.166370" /> 
<class name="tag:Biography" val="-0.126149" /> 
<class name="tag:Religion" val="-0.034275" /> 
<class name="tag:Cartoon" val="-0.487169" /> 
<class name="tag:Auto_Racing" val="-0.047648" /> 
<class name="tag:Pets" val="-0.118809" /> 
</doc> 

文件不具有例如文件名XML擴展是test.values

嘗試第一次,我決定使用Python外殼:我使用python的蟒蛇版版本:

Python 2.7.9 |Anaconda 2.1.0 (x86_64)| (default, Dec 15 2014, 10:37:34) 
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
Anaconda is brought to you by Continuum Analytics. 
Please check out: http://continuum.io/thanks and https://binstar.org 

>>> import xml.etree.ElementTree as ET 
>>> tree = ET.parse('test.values') 

我收到以下錯誤:

xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 14, column 43 

在該行近看後:

<class name="tag:Hip-Hop_&_Rap_Music" val="-0.290353" /> 

我意識到它有&,我有些什麼猜測是泰德xml.etree包不打開UTF模式下的文件:

我手動刪除&和事情工作正常。但問題是我必須閱讀大量的文件和解析。基於我的谷歌搜索,我找不到任何示例etree打開文件在utf-8模式。我該如何解決這個問題?

回答

1

你說得對,它的&,但並不表明它使用Unicode做(儘管也許Unicode的問題可以拿出你解決這個之後。

你不能有符號的或低於(如分別爲& amp;或& lt;因此,無論編寫哪個程序,都應該修復XML以檢測並重新編碼這些字符)

+0

這些是來自第3代的數據轉儲所以它幾乎不可能改變原始代碼,我想我必須逐行讀取並去掉這些字符。 – 2015-03-03 14:04:00

+1

re.sub(r'&','&',s) – TextGeek 2015-03-03 19:05:03