TypeError: не могу выбрать объекты ElementBase

Я очищаю веб-страницу для некоторых данных, а затем хочу сохранить их в базе данных ZODB. Скрапинг:

STARTING_URL = "https://persoanefizice.otpbank.ro/ro/curs-valutar"
page = requests.get(STARTING_URL)

tree = html.fromstring(page.text)
z = tree.xpath('//tr/td[position()<5]/text()')

Очистка выполняется в сценарии, а сохранение в базе данных выполняется в другом, вызывая его следующим образом:

datainput.main(pres,nume,val_c,val_v,data_de_azi,'OTP')

Моя ошибка появляется, когда я пытаюсь вызвать его. Учитывая следующий код:

STARTING_URL = "https://persoanefizice.otpbank.ro/ro/curs-valutar"
page = requests.get(STARTING_URL)

tree = html.fromstring(page.text)
z = tree.xpath('//tr/td[position()<5]/text()')

contor = 0
while contor < len(z) :
    pres = z[contor]
    nume = z[contor+1]
    val_c = z[contor+2]
    val_v = z[contor+3]

#   pdb.set_trace()
    datainput.main(pres,nume,val_c,val_v,data_de_azi,'OTP')
    print z[contor],z[contor+1],z[contor+2],z[contor+3],data_de_azi,'OTP'
    contor = contor + 4

Я получаю это сообщение об ошибке:

TypeError: can't pickle ElementBase objects

Полная обратная связь:

>     datainput.main(pres,nume,val_c,val_v,data_de_azi,'OTP')   File "/home/iulian/workspace/Python/Crawler/datainput.py", line 36, in main
>     transaction.commit()   File "/usr/local/lib/python2.7/dist-packages/transaction/_manager.py", line
> 111, in commit
>     return self.get().commit()   File "/usr/local/lib/python2.7/dist-packages/transaction/_transaction.py",
> line 280, in commit
>     reraise(t, v, tb)   File "/usr/local/lib/python2.7/dist-packages/transaction/_transaction.py",
> line 271, in commit
>     self._commitResources()   File "/usr/local/lib/python2.7/dist-packages/transaction/_transaction.py",
> line 417, in _commitResources
>     reraise(t, v, tb)   File "/usr/local/lib/python2.7/dist-packages/transaction/_transaction.py",
> line 391, in _commitResources
>     rm.commit(self)   File "/usr/local/lib/python2.7/dist-packages/ZODB/Connection.py", line 572,
> in commit
>     self._commit(transaction)   File "/usr/local/lib/python2.7/dist-packages/ZODB/Connection.py", line 628,
> in _commit
>     self._store_objects(ObjectWriter(obj), transaction)   File "/usr/local/lib/python2.7/dist-packages/ZODB/Connection.py", line 663,
> in _store_objects
>     p = writer.serialize(obj)  # This calls __getstate__ of obj   File "/usr/local/lib/python2.7/dist-packages/ZODB/serialize.py", line 419,
> in serialize
>     return self._dump(meta, obj.__getstate__())   File "/usr/local/lib/python2.7/dist-packages/ZODB/serialize.py", line 428,
> in _dump
>     self._p.dump(state)   File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
>     raise TypeError, "can't pickle %s objects" % base.__name__ TypeError: can't pickle ElementBase objects

person Petchesi Iulian-Alexandru    schedule 26.10.2015    source источник


Ответы (1)


Что решило мою проблему, так это преобразовать данные z[] в строку перед сохранением в такой переменной:

pres = str(z[contor])
nume = str(z[contor+1])
val_c = str(z[contor+2])
val_v = str(z[contor + 3])
person Petchesi Iulian-Alexandru    schedule 27.10.2015