Можно ли выбрать поле формы с механизацией в зависимости от типа поля (например, TextControl, TextareaControl)? - PullRequest
1 голос
/ 26 июня 2010

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

Тем не менее, всегда есть два поля TextControl сразу после друг друга, а затем под ним находится TextareaControl. Эти три поля мне тоже нужны, в основном мне нужно разобрать их имена и все хорошо. За последние пару часов я просматривал документацию по механизации и не нашел ничего, что могло бы сделать это, как бы это ни казалось простым (мне все равно).

Я предложил альтернативное решение, которое включает в себя создание списка элементов управления формы, итерацию по нему, чтобы найти элементы управления, содержащие строку «Текст», возвращающие новый список, и затем, наконец, удаление имени с помощью регулярное выражение. Хотя это работает, оно кажется ненужным, и мне интересно, есть ли более элегантное решение. Спасибо, ребята.

edit: Вот что я сейчас делаю, чтобы извлечь эту информацию, если кому-то интересно. Я думаю, что я, вероятно, просто буду придерживаться этого. Это кажется ненужным, но оно выполняет свою работу и ничего интенсивного, так что я не беспокоюсь об эффективности или о чем-либо.

def formtextFieldParse(browser):
 '''Expects a mechanize.Browser object with a form already selected. Parses 
 through the fields returning a tuple of the name of those fields. There 
 SHOULD only be 3 fields. 2 text followed by 1 textarea corresponding to 
 Posting Title, Specific Location, and Posting Description'''
 import re
 pattern = '\(.*\)'
 fields = str(browser).split('\n')
 textfields = []
 for field in fields:
     if 'Text' in field: textfields.append(field)
 titleFieldName = re.findall(pattern, textfields[0])[0][1:-2]
 locationFieldName = re.findall(pattern, textfields[1])[0][1:-2]
 descriptionFieldName = re.findall(pattern, textfields[2])[0][1:-2]

1 Ответ

1 голос
/ 26 июня 2010

Я не думаю, что mechanize обладает именно той функциональностью, которая вам требуется; Не могли бы вы использовать mechanize для получения HTML-страницы, а затем проанализировать последнюю, например, с помощью BeautifulSoup?

...