天天看點

python編碼格式的問題_Python解析XML是出現編碼問題

Python解析XML是出現編碼問題

在python中遇到編碼問題是一個非常痛苦的問題。

在使用Python處理XML的問題上,首先遇到的是編碼問題。

Python并不支援gb2312,是以面對encoding="gb2312"或encoding="utf8"的XML檔案會出現錯誤。Python讀取的檔案本身的編碼也可能導緻抛出異常,這種情況下打開檔案的時候就需要指定編碼。此外就是XML中節點所包含的中文。Python預設的是解析XML是編碼為“UTF-8”和“UTF-16”。是以出現encoding

error !問題

我這裡呢,處理就比較簡單了,隻需要修改XML的encoding頭部。方法如下:

方法一:

檔案 test.xml内容如下

<?xml version=”1.0″

encoding=”gbk”?>

…………….

要用python解析一下檔案的内容。

采用minidom解析

xmldoc = minidoc.parse(file_name);

會出現這個錯誤

xml.parsers.expat.ExpatError: unknown encoding: line 1, column

30

經過查找肯定會發現是minidom不支援gbk編碼,那麼檔案是gbk編碼的,肯定是錯誤的,是以将檔案轉碼為utf-8

(指令 iconv -f gbk -t utf-8

filename -o filename_new)

現在對新的utf-8編碼的檔案進行解析操作,依舊是報錯,這是為什麼呢?

原因是<?xml version=”1.0″

encoding=”gbk”?>這個句子在做過,minidom在底層對這個語句進行了識别,也就是不僅僅檔案要變成utf-8編碼的,而且這裡

也要變成<?xml version=”1.0″

encoding=”utf-8″?>。再試驗一次,全部ok了

給段操作代碼

file_xml =

open(file_name,”r”).read()

file_xml = file_xml.replace(‘<?xml version=”1.0″

encoding=”gbk”?>’,'<?xml

version=”1.0″ encoding=”utf-8″?>’)

file_xml = unicode(file_xml,encoding=’gbk’).encode(‘utf-8′)

xmldoc = minidoc.parseString(file_xml)

方法二:

自己在網上找了些資料,寫了個腳本,把XML檔案轉化成你想要的編碼就可以了。

#!/usr/bin/env python

import os, sys

import re

def replaceXmlEncoding(filepath, oldEncoding='gb2312',

newEncoding='utf-8'):

f =

open(filepath, mode='r')

content =

f.read()

content =

re.sub(oldEncoding, newEncoding, content)

f.close()

f =

open(filepath, mode='w')

f.write(content)

f.close()

if __name__ == "__main__":

replaceXmlEncoding('./ActivateAccount.xml')

方法三:

在官網和在官方論壇上看到了一些相關的解決辦法:

EncodingDecl

::=

S

'encoding' Eq ('"'

EncName

'"' | "'" EncName

"'" )

EncName

::=

[A-Za-z] ([A-Za-z0-9._] | '-')*

In the document

entity, the encoding declaration is part of the XML

declaration. The EncName

is the name of the encoding used.(http://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl)

沒有太明白,具體就是修改編碼的格式聲明,擴大了解析時能夠識别的格式。

方法四:

最簡單的辦法就是把XML格式改成解析器預設的格式,但是如果不能改,或者檔案太多,一個一個改浪費時間,或者在XML的生成是就預設了其他的格式就很麻煩了一個一個改。是以運用上面辦法也可以解決問題