Отличная страница, пришедшая из мира Perl, и после нескольких лет бездействия я снова начал программировать (этой веб-страницы не было, как все меняется). И теперь, после двух полных дней поиска, я разыгрываю последнюю карточку с просьбой о помощи.
Работа в среде Mac с python 3.2 и lxml 2.3 (установленным по адресу www.jtmoon.com/?p=21), что я пытаюсь сделать:
Мой код. Я поставил несколько попыток и выходной код.
from lxml.html import parse, submit_form, tostring
page = parse('http://biodbnet.abcc.ncifcrf.gov/db/db2db.php').getroot()
page.forms[0].fields['input'] = 'GI Number'
page.forms[0].inputs['outputs[]'].value = 'Gene ID'
page.forms[0].fields['hasComma'] = 'no'
page.forms[0].fields['removeDupValues'] = 'yes'
page.forms[0].fields['request'] = 'db2db'
page.forms[0].action = 'http://biodbnet.abcc.ncifcrf.gov/db/db2dbRes.php'
page.forms[0].fields['idList'] = '86439006'
submit_form(page.forms[0])
Выход:
File "/Users/gerard/Desktop/barbacue/MGFtoXML.py", line 30, in <module>
page.forms[0].inputs['outputs[]'].value = 'Gene ID'
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/lxml/html/__init__.py", line 1058, in _value__set
"You must pass in a sequence")
TypeError: You must pass in a sequence
Итак, поскольку этот элемент является элементом с несколькими вариантами выбора, я понимаю, что должен предоставить список
page.forms[0].inputs['outputs[]'].value = list('Gene ID')
Выход:
File "/Users/gerard/Desktop/barbacue/MGFtoXML.py", line 30, in <module>
page.forms[0].inputs['outputs[]'].value = list('Gene ID')
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/lxml/html/__init__.py", line 1059, in _value__set
self.value.clear()
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/lxml/html/_setmixin.py", line 115, in clear
self.remove(item)
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/lxml/html/__init__.py", line 1159, in remove
"The option %r is not currently selected" % item)
ValueError: The option 'Affy ID' is not currently selected
«Affy ID» - это первое значение в списке, и оно не выбрано. Но в чем проблема?
Удивительно, если я вместо этого поставлю
page.forms[0].inputs['outputs[]'].multiple = list('Gene ID')
#page.forms[0].inputs['outputs[]'].value = list('Gene ID')
Тогда как-то lxml это понравится, и двигаться дальше. Тем не менее, атрибут множественного значения должен быть логическим (на самом деле это так, если я печатаю значение), я не должен его трогать, а «значение» элемента должно фактически указывать на выбранные элементы, согласно документации lxml.
Новый вывод
File "/Users/gerard/Desktop/barbacue/MGFtoXML.py", line 87, in <module>
submit_form(page.forms[0])
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/lxml/html/__init__.py", line 856, in submit_form
return open_http(form.method, url, values)
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/lxml/html/__init__.py", line 876, in open_http_urllib
return urlopen(url, data)
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/urllib/request.py", line 138, in urlopen
return opener.open(url, data, timeout)
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/urllib/request.py", line 364, in open
req = meth(req)
File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/urllib/request.py", line 1052, in do_request_
raise TypeError("POST data should be bytes"
TypeError: POST data should be bytes or an iterable of bytes. It cannot be str.
Итак, что можно сделать ?? Я уверен, что с Python 2.6 я мог бы использовать mecanize, или, возможно, lxml может работать? Но я действительно не хочу кодировать в какой-то устаревшей версии. Я наслаждаюсь большим питоном, но я начинаю думать о возвращении в Perl. Возможно, это могло быть умное движение ??
Любая помощь будет высоко оценена
Gerard
- Читая на этом форуме, я нахожу pythonpaste.org, может ли он заменить lxml?