2017-08-13 23 views
1

XMLヘッダ:XML構文解析と(再度)ユニコード

<?xml version="1.0" encoding="UTF-8"?><points> 

XMLデータがスニペット:

<point> 
<id>1781</id><lon>43.245766666667</lon><lat>56.636883333333</lat> 
<type>vert</type><last_update>2016-11-18 22:55:11</last_update> 
<active>1</active><verified>1</verified><international>0</international><name>Vеrshilovo</name><name_ru>Вершилово</name_ru><city/><belongs>АОН</belongs><inde 

コード:

tree = ET.parse(XMLFIL) 
root = tree.getroot() 
allpoints=root.findall('point') 
for point in allpoints: 
id=point.find('id').text 
name=point.find('name').text.encode('utf8') 
print name 

これははAttributeError「を私に報酬を与えるであろう:「NoneType 'オブジェクトには属性がありません' encode '"エンコードを外すと悪名高い" ascii "コーデックが文字' u0435 'を位置1にエンコードできない:ordinal not i Nレンジ(128)」

NBエラーがである 『『Vershilovo』の』 E:それはそのようなOKに見えますが、XMLデータのhexdumpに対しては

00000000 56 e5 72 73 68 69 6c 6f 76 6f 0a     |V.rshilovo.| 

を与え、私はいくつかの関連の質問を見つけましたが、誰も私に解決策をもたらしませんでした。根本的な原因は、私のxmlデータの不正なエンコードである可能性がありますが、私はそれを制御することはできません。私はかなりの "?"のようないくつかのデフォルトに不正な値をリセットする必要がありますと生きることができますまたはそのような。

答えて

0

いくつかのアイテムにはtext属性がないようです。 textは、Noneある場合は、ブロック以外のtry-使用するか、デフォルト値を使用することができます例えば:それはどのように動作するか

name = point.find('name').text 
if name: 
    name = name.encode('utf8') 
+0

私は本当に理解することはできません:if文を使用して

name = (point.find('name').text or '').encode('utf8') 

別の例として、 - それはあります!出力には、「不規則な」憲章が含まれています。00000000 31 37 38 31 20 56 d0 b5 72 73 68 69 6c 6f 76 6f | 1781 V..rshilovo | –

+0

'text'が' None'の場合に空の文字列を使うだけです。そうすれば、pythonは例外をスローしません。 try-exceptまたはif-elseを使用することもできますが、1ライナーが好きです;) –