cElementTree: не правильно сформирован (неверный токен) - PullRequest
1 голос
/ 13 сентября 2011

пытается очистить этот XML-файл в сети с помощью urllib и cElementTree.Я использую Google App Engine, но не думаю, что проблема связана с моей платформой.

Это моя ошибка:

<type 'exceptions.SyntaxError'>: not well-formed (invalid token): line 1, column 25
Traceback (most recent call last):
  File "/base/data/home/apps/metautoit/daily-update.353244196034914877/Start_Update.py", line 25, in main
    ShoppingCar.XMLRipper().getNew()
  File "/base/data/home/apps/metautoit/daily-update.353244196034914877/updatecars/sitecrawlers/ShoppingCar.py", line 24, in getNew
    for carDict in newCars:
  File "/base/data/home/apps/metautoit/daily-update.353244196034914877/updatecars/sitecrawlers/ShoppingCar.py", line 67, in _iter_carDicts_in_xml
    tree = self.get_xml()
  File "/base/data/home/apps/metautoit/daily-update.353244196034914877/updatecars/sitecrawlers/ShoppingCar.py", line 63, in get_xml
    return ET.parse(req, parser=parser)
  File "<string>", line 45, in parse
  File "<string>", line 28, in parse

XML-файл длинный, но вот пример:

<?xml version="1.0" encoding="windows-1252"?><veicoli>
<veicolo>
    <id><![CDATA[16529]]></id>
    <link><![CDATA[http://www.shoppingcar.it/auto_usate_/Chrysler_PT_Cruiser/16529.asp]]></link>
    <marca><![CDATA[Chrysler]]></marca>
    <modello><![CDATA[PT Cruiser]]></modello>
    <versione><![CDATA[2.4 L]]></versione>
    <provincia><![CDATA[Padova]]></provincia>
    <anno><![CDATA[2006]]></anno>
    <mese><![CDATA[4]]></mese>
    <chilometri><![CDATA[26000]]></chilometri>
    <cilindrata><![CDATA[]]></cilindrata>
    <potenza><![CDATA[143]]></potenza>
    <alimentazione><![CDATA[Benzina]]></alimentazione>
    <cambio><![CDATA[Cambio Automatico]]></cambio>
    <colore><![CDATA[nero]]></colore>
    <prezzo><![CDATA[14900]]></prezzo>
    <immagine><![CDATA[http://www.shoppingcar.it/public/Auto%20Usate/Berline/imagesadv/16529_2.jpg]]>
    </immagine>
</veicolo>
</veicoli>

Мой (упрощенный) код выглядит следующим образом:

xml_url =   "http://www.shoppingcar.it/feed/export_vel.asp?parametro=1"
req =       urllib.urlopen(xml_url)
parser =    ET.XMLParser(encoding="windows-1252")
tree =      ET.parse(req, parser=parser).get_xml()

Вот кикер: я скачал и загрузил его как общедоступный файл Dropbox.Используя этот URL, XML-разборки просто отлично.Я пробовал без объявления кодировки и пробовал кодировки windows-1252 и utf-8.Это действительно странно, потому что колонка 25 - не что иное, как середина слова «кодировка».Любая помощь приветствуется.

1 Ответ

1 голос
/ 13 сентября 2011

Я попробовал ваш код (добавил импорт, чтобы другие могли попробовать):

#!/usr/bin/env python
import xml.etree.cElementTree as ET
import urllib

xml_url =   "http://www.shoppingcar.it/feed/export_vel.asp?parametro=1"
req =       urllib.urlopen(xml_url)
parser =    ET.XMLParser(encoding="windows-1252")
tree =      ET.parse(req, parser=parser).get_xml()

, и он работает просто отлично.Если ваша ошибка происходит только на сервере, то вы, вероятно, достигли предела на веб-странице и пытаетесь проанализировать сообщение об ошибке.Поэтому убедитесь, что вы действительно анализируете документ (например, data = req.read(), а затем выгрузите данные и проанализируете строку как xml.

...