2

Google Weather 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 でエラーを見つけることができません<unknown>:1:179

ありがとう。

4

1 に答える 1

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 ビット バイトにエンコードする方法の 1 つにすぎません。UTF-8 は 256 文字を超える文字をエンコードする必要があるため、2、3、および 4 バイトのシーケンスを使用します。あいまいさを避けるために、これらのシーケンスは他の方法では使用できない文字で始まる必要があるため、これらのマルチバイト シーケンスの開始をマークするために、一連の上位ビット パターン (および特定のバイト値のセット) が予約されています。ISO-8859-1 (文字をエンコードする別の方法) で使用されるエンコードáは、マルチバイト シーケンスをマークするために UTF-8 で予約されている文字とたまたま競合します。

これらの問題に関する混乱の一部は、後方互換性のために、文字コード 0x20 から 0x7f までのすべての異なるエンコード方法が同じ (1 バイト) であるという事実に起因しています。標準 ASCII の一部ではない文字に踏み込むと、エンコーディングによって状況が異なります。

より具体的にするには:

Unicode á   - 0x00E1 
ISO-8859-1  - 0xE1
UTF-8       - 0xc3 0xa1

ここで起こったことは、歴史的に (Unicode の前に)áさまざまなコンピューター標準 (Windows-1252 など) で値 0xE1 が既に割り当てられていたことです。Unicode が考案されたとき、彼らはこのコードを保持しましたが、この値を UTF-8 でエンコードするようになったとき、ルールはこれが 2 バイト シーケンス 0xc3 0xa1 になることを指定します。単一の文字値 0xE1 は、UTF-8 では単独で発生することは許可されていません (4 バイト シーケンスの開始を示していると思いますが、間違っている可能性があります)。

于 2012-08-15T05:44:44.747 に答える