【问题标题】:cElementTree <type 'exceptions.SyntaxError'>: not well-formed (invalid token)cElementTree <type 'exceptions.SyntaxError'>: not well-formed (invalid token)
【发布时间】:2011-09-13 19:44:02
【问题描述】:

尝试使用 urllib 和 cElementTree 在 Web 上抓取此 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()

这是关键:我下载并上传了它作为公共保管箱文件。使用这个 url 可以很好地解析 xml。我尝试过不声明编码,并尝试了 windows-1252 和 utf-8 编码。这真的很奇怪,因为第 25 列只不过是“编码”这个词的中间。任何帮助表示赞赏。

【问题讨论】:

  • 我注意到从该站点下载提要对我来说花费了很长时间(可能只是由于 ping 不佳)。也许您遇到与服务器的连接问题?我解析没有问题。

标签: python xml elementtree


【解决方案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。

【讨论】:

  • “试图解析错误消息”你怎么知道的?我得到的错误:&lt;font face="Arial" size=2&gt; &lt;p&gt;Errore di run-time di Microsoft VBScript&lt;/font&gt; &lt;font face="Arial" size=2&gt;error '800a0046'&lt;/font&gt; &lt;p&gt; &lt;font face="Arial" size=2&gt;Autorizzazione negata&lt;/font&gt; &lt;p&gt; &lt;font face="Arial" size=2&gt;/feed/export_vel.asp&lt;/font&gt;&lt;font face="Arial" size=2&gt;, line 558&lt;/font&gt; 基本上说权限被拒绝 - 非常感谢提示!
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多