Я пытаюсь разобрать 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]