Ich versuche, mechanize (v0.2.5) zu verwenden, um mit einem Formular auf einer Seite zu arbeiten, die ein deaktiviertes Bild als eines der Formularelemente enthält. Wenn ich versuche, das Formular auszuwählen, erhöht mechanize AttributeError: control 'test' is disabled
, wobei test
der Name des deaktivierten Steuerelements ist. Zum Beispiel
Führt zu diesem Stack-Trace:
%Vor% Wenn wir den mechanisierten Quellcode untersuchen, sieht es so aus, als ob dieser Fehler immer dann auftritt, wenn es ein Formularelement gibt, das ein mechanize.SubmitControl
ergibt und das kein vordefiniertes value
-Attribut hat. Beispielsweise würde das folgende Formular den gleichen Fehler auslösen:
Ich bin mir nicht sicher, ob das als Bug zählen sollte, aber gibt es in jedem Fall einen Workaround? Gibt es beispielsweise eine Möglichkeit, den HTML-Code der Zielseite zu ändern, um die deaktivierten Steuerelemente zu aktivieren, bevor ich br.select_form()
?
BEARBEITEN
Ich habe einen Patch zur Mechanisierung eingereicht, der dieses Problem behebt.
Leider ist es mehr als ein Jahr her und der Mechanize-Upstream hat die Pull-Anfrage immer noch nicht zusammengeführt .
Inzwischen können Sie diesen Affen-Patch, den ich geschrieben habe, verwenden, um den Fehler zu umgehen, ohne eine gepatchte Version manuell installieren zu müssen. Hoffentlich wird dieser Fehler behoben, wenn (wenn) 0.2.6 veröffentlicht wird, also gilt der Patch nur für Versionen 0.2.5 und früher.
%Vor%Das ist definitiv ein Bug, der es upstream meldet, einen Patch macht, ihn upstream sendet und in der Zwischenzeit die gepatchte Version verwendet, ist ein ziemlich richtiger Weg, damit umzugehen. (Danke, dass du diesen Weg gewählt hast.)
Wie Sie bereits erwähnt haben, ist es ein anderer Ansatz, es durch Vorverarbeitung von Quell-HTML zu bearbeiten (das kann nützlich sein, wenn Sie in Eile sind oder die gepatchte Version aus irgendeinem Grund nicht verwenden können / wollen), aber beachten Sie dass Workarounds der Community nicht helfen). Für die Nachbearbeitung kann jede geeignete Methode verwendet werden - von str.replace () bis zur Verarbeitung auf DOM-Ebene mit BeautifulSoup oder lxml .