使用gdata-python-client访问Google图书搜索数据API时出现SyntaxError
>>> import gdata.books.service
>>> service = gdata.books.service.BookService()
>>> results = service.search_by_keyword(isbn='0434003484')
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
results = service.search_by_keyword(isbn='0434003484')
... snip ...
File "C:\Python26\lib\site-packages\atom\__init__.py", line 127, in CreateClassFromXMLString
tree = ElementTree.fromstring(xml_string)
File "<string>", line 85, in XML
SyntaxError: syntax error: line 1, column 0
这是一个简单的例子——特别是,包里面的书籍服务单元测试也出现了完全相同的错误。我查看了Google Code上的维基和公开问题,但没有找到解决办法(我觉得这更可能是我这边的一个小错误,而不是库本身的问题)。我不太确定该如何理解这个错误信息。如果有关系的话,我使用的是python 2.6.5和最新版本的gdata,也就是2.0.10。
3 个回答
1
我在尝试查看这个xml字符串时,发现它开头有一个小写的 <!doctype html>
(应该是大写的 DOCTYPE
),这当然导致了XML解析失败——这绝对是书籍服务中的一个错误,需要报告一下。作为一个临时解决办法,你可以修改 atom/__init__.xml
文件,把第127行改成...:
tree = ElementTree.fromstring(xml_string.replace('doctype','DOCTYPE'))
不过,虽然这样可以解决XML中的这个错误,但在第496列又出现了另一个错误(我想那是在一些javascript代码的中间)。我想书籍服务在这个时候可能整体上都有问题...:-(
2
sje397的回答是正确的;在你上面的例子中,如果你执行:
service.ssl = False
在运行search_by_keyword方法之前,结果是正确返回的。如果你不把SSL设置为false,那么因为客户端没有正确认证,请求就会被重定向到谷歌的主页(所以Alex Martelli看到的错误其实是你访问http://www.google.com时得到的HTML内容……这显然不是格式正确的XML)。
3
我发现为了让gdata客户端正常工作,我需要关闭SSL功能:
...
gd_client.ProgrammaticLogin()
gd_client.ssl = False
...