Deina Underhill
Deina Underhill

Reputation: 567

objectify and etree elements

The module I've been writing works finestkind with the test data file, but totally moofs on the live data from flickrapi.

After days of frustration (see, I DO have a lot of nothing to do!) I think I found the problem, but I don't know the fix for it.

Beyond this point in the module, I use objectify. Objectify parses <type 'str'> just fine, but it will not read the etree elements. I think I need to convert the class 'xml.etree.ElementTree.Element' to str(), but haven't sussed that out yet.

The error I get from objectify.fromstring() is:

Traceback (most recent call last):
    File "C:\Mirc\Python\Temp Files\test_lxml_2.py", line 101, in <module>
        Grp = objectify.fromstring(flickr.groups_getInfo(group_id=gid))
    File "lxml.objectify.pyx", line 1791, in lxml.objectify.fromstring (src\lxml\lxml.objectify.c:20904)
    File "lxml.etree.pyx", line 2994, in lxml.etree.fromstring (src\lxml\lxml.etree.c:63296)
    File "parser.pxi", line 1614, in lxml.etree._parseMemoryDocument (src\lxml\lxml.etree.c:93607)
ValueError: can only parse strings

Please help before the boss turns loose those damn flying monkeys again!!!

import fileinput
from lxml import html, etree, objectify
import re
import time
import flickrapi


if '@N' in gid:
    try:
        if tst:
            Grp = objectify.fromstring(test_data)
        else:
            Grp = objectify.fromstring(flickr.groups_getInfo(group_id=gid))

        fErr = ''
        mn = Grp.xpath(u'//group')[0].attrib
        res = Grp.xpath(u'//restrictions')[0].attrib
        root = Grp.group

        gNSID = gid
        gAlias = ""
        err_tst = getattr(root, "not-there", "Error OK")
        gName = getattr(root, "name", "")
        Images = getattr(root, 'pool_count', (-1))
        Mbr = getattr(root, "members", (-1))

Upvotes: 1

Views: 3653

Answers (2)

h.yekta
h.yekta

Reputation: 11

I think the "test_data" that you pass to objectify.fromstring is instansce of String IO , so you must read it first then objectify:

objectify.fromstring(test_data.read())

Upvotes: 1

Marcin
Marcin

Reputation: 49846

The solution is to stop converting your live data to xml.etree.ElementTree.Element objects before invoking the objectify api.

If that's impossible (which I doubt), you can render the xml back to a text representation with lxml.etree.tostring, then pass that to etree.objectify.fromstring.

Upvotes: 3

Related Questions