Python sax,没有格式错误

时间:2012-08-15 04:14:55

标签: python xml

我试图解析来自谷歌天气api的回复,但我得到的不是格式错误,据我所知,响应形成良好。

以下是相关代码:

f = urllib.urlopen(WEATHERPATH + sys.argv[1])
parser = make_parser()
parser.setContentHandler(GoogleWeatherHandler())
parser.parse(f)

XML:

<?xml version="1.0"?>
<xml_api_reply version="1">
    <weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1" row="0" section="0" >
        <forecast_information>
            <city data="Ciudad Ju�rez, Chihuahua"/><postal_code data="Juarez"/>
            <latitude_e6 data=""/>
            <longitude_e6 data=""/>
            <forecast_date data="2012-08-14"/>
            <current_date_time data="2012-08-15 02:51:00 +0000"/>
            <unit_system data="US"/></forecast_information>
            <current_conditions>
                <condition data="Cloudy"/>
                <temp_f data="91"/>
                <temp_c data="33"/>
                <humidity data="Humidity: 22%"/>
                <icon data="/ig/images/weather/cloudy.gif"/>
                <wind_condition data="Wind: SE at 6 mph"/>
            </current_conditions>
                        // similar markup
</weather>
</xml_api_reply>

和错误:

Traceback (most recent call last):
  File "weather.py", line 34, in <module>
    main()
  File "weather.py", line 30, in main
    parser.parse(f)
  File "c:\Python26\lib\xml\sax\expatreader.py", line 107, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "c:\Python26\lib\xml\sax\xmlreader.py", line 123, in parse
    self.feed(buffer)
  File "c:\Python26\lib\xml\sax\expatreader.py", line 211, in feed
    self._err_handler.fatalError(exc)
  File "c:\Python26\lib\xml\sax\handler.py", line 38, in fatalError
    raise exception
xml.sax._exceptions.SAXParseException: <unknown>:1:179: not well-formed (invalid
 token)

所有的导入都已经到位了,我相信翻译但是我找不到xml上的erron,第二:了解<unknown>:1:179意味着什么会很麻烦。

感谢。

1 个答案:

答案 0 :(得分:3)

看起来á中的重音Juárez字符就是问题所在。你没有告诉解析器编码是什么,所以它显然是默认的,可能是UTF-8,其中该字符值无效 - 即它期望UTF-8编码,你的实际编码可能是ISO-8859- 1。

将解析器配置为期望ISO-8859-1,您的问题应该消失。

如果您可以修改XML,请将标题更改为

<?xml version="1.0" encoding="iso-8859-1" ?>

Unicode是定义字符集的标准,是对所有已知语言中每个可能字符的唯一编号的抽象赋值。

UTF-8只是编码 8位字节中这些字符的几种可能方法之一。由于UTF-8必须编码超过256个字符,因此它使用2个,3个和4个字节的序列。为避免歧义,这些序列必须以不能使用的字符开头,因此保留一组高阶位模式(以及某些字节值集)以标记这些多字节序列的开头。 ISO {8859-1中使用的编码(不同的编码字符的方式)恰好与UTF-8中保留的字符冲突,以标记多字节序列。

对这些问题的部分混淆源于这样的事实:对于字符代码0x20到0x7f,所有不同的编码方法都是相同的(单个字节)以实现向后兼容。冒险使用不属于标准ASCII的字符时,根据编码情况会有所不同。

更具体:

á

这里发生的事情是历史上(在Unicode之前)Unicode á - 0x00E1 ISO-8859-1 - 0xE1 UTF-8 - 0xc3 0xa1 已经在各种计算机标准(例如Windows-1252)中分配了值0xE1。当设计Unicode时,他们保留了这段代码,但是当用UTF-8 编码这个值时,规则指定这变为2字节序列0xc3 0xa1。单字符值0xE1不允许在UTF-8中自行发生(我相信它标志着4字节序列的开始,但我可能会弄错)。