我试图解析来自谷歌天气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
意味着什么会很麻烦。
感谢。
答案 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字节序列的开始,但我可能会弄错)。