Python 3.2 lxml заполнить и отправить форму, выбрать несколько, как это сделать?значение не работает - PullRequest
1 голос
/ 03 июля 2011

Отличная страница, пришедшая из мира 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?

1 Ответ

2 голосов
/ 03 июля 2011

Передача последовательности в list() создаст список из этой последовательности. 'Gene ID' - это последовательность (а именно последовательность символов). Так list('Gene ID') сгенерирует список символов, например так:

>>> list('Gene ID')
['G', 'e', 'n', 'e', ' ', 'I', 'D']

Это не то, что вы хотите. Попробуйте это:

>>> ['Gene ID']
['Gene ID']

Другими словами:

page.forms[0].inputs['outputs[]'].value = ['Gene ID']

Это должно немного продвинуть вас вперед.

...