SyntaxError с использованием gdata-python-client для доступа к API данных Поиска книг Google

>>> 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 ответа

Решение

Я обнаружил, что мне нужно отключить SSL в клиенте gdata, чтобы он работал:

...
gd_client.ProgrammaticLogin()
gd_client.ssl = False
...

Ответ sje397 является правильным; в вашем примере выше, если вы делаете:

service.ssl = False

перед запуском метода search_by_keyword результат возвращается должным образом. Если вы не установили для SSL значение false, то, поскольку клиент не прошел надлежащую аутентификацию, запрос перенаправляется на главную домашнюю страницу Google (поэтому Алекс Мартелли обнаружил ошибки в том HTML-коде, который вы получили при переходе на http://www.google.com/... определенно не правильно сформированный XML).

Взломав немного, чтобы увидеть строку XML, я заметил, что она имеет нижний регистр <!doctype html> в начале (должен быть в верхнем регистре DOCTYPE) что, разумеется, приводит к сбою синтаксического анализа XML - определенно ошибка в сервисе книги, о которой необходимо сообщить. В качестве временного решения вы можете взломать atom/__init__.xml изменить строку 127 на...:

tree = ElementTree.fromstring(xml_string.replace('doctype','DOCTYPE'))

но хотя эта ошибка в XML исчезает, в столбце 496 обнаруживается еще одна ошибка (я думаю, что она находится в середине некоторого кода JavaScript). Я полагаю, что на данный момент в книжном сервисе что-то не так...:-(

Другие вопросы по тегам