cElementTree <类型 '异常.语法错误'>: 格式不正确(无效令牌)
我正在尝试用urllib和cElementTree从网上抓取一个xml文件。我使用的是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文件里。用这个网址,xml文件解析得很好。我试过不声明编码,也试过windows-1252和utf-8编码。真让人困惑的是,第25列的内容只是“encoding”这个词的一部分。任何帮助都非常感谢。
1 个回答
1
我试了你的代码(加了一些导入,这样其他人也可以试试):
#!/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解析)。