textarea要素を含むフォームに入力しようとしています。私はBeautifulSoapとmechanizeモジュールでPythonを使用しています(FreeBSDリポジトリの最新モジュールであるBeautifulSoup3.1.0.1とmechanize0.2.1を使用してFreeBSD8.1で2.6.5に固執しています)。
BeautifulSoapの問題は、テキストエリアのコンテンツが適切に設定されていないことです(試しsoup.textarea.insert(0, "FOO")
てみることができsoup.textarea.contents = "FOO"
ますが、現在の値をで確認するとsoup.textarea
、間にコンテンツがない古いHTMLタグが表示されます。
<textarea name="classified_description" class="classified_textarea_text"></textarea>
mechanizeの問題は、実際のフォームでのみ動作するように見えることです。以下で解析しているHTMLによると、これは実際にはフォームではなく、入力項目を含むdivのセットです。
Pythonまたはこれらのモジュールのいずれかを使用してこのtextarea要素の値を設定するにはどうすればよいですか?
<div class="classified_field">
<div class="classified_input_label">Description</div>
<div class="classified_textarea_div">
<textarea name="classified_description" id="classified_description" class="classified_textarea_text"></textarea>
</div>
<div class="site_clear"></div>
</div>
以下でウラジミールのテクニックを試しましたが、彼の例では機能しますが、何らかの理由で本番コードでは機能しません。私は.find()
を取得するために使用することができますtextarea
が、それ.insert()
は私に悲しみを与えています。これが私がこれまでに持っているものです:
>>> soup.find('textarea', {'name': 'classified_description'})
<textarea name="classified_description" class="classified_textarea_text"></textarea>
>>> soup.find('textarea', {'name': 'classified_description'}).insert(0, "some text here")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.6/site-packages/BeautifulSoup.py", line 233, in insert
newChild.nextSibling.previousSibling = newChild
AttributeError: 'unicode' object has no attribute 'previousSibling'
>>>
なぜこれがUnicodeエラーを介して行われるのか誰もが知っていますか?明らかに、私のsoup
オブジェクトは、を正常に使用しているため、単なるUnicode文字列ではありません.find
。
解決策:Vladimirの解決策は正しいですが、実際のHTMLmalformed start tag
でBeautifulSoup 3.1でエラーが生成される可能性があります(公式の理由はこちら)。BeautifulSoup 3.0.8にダウングレードした後、すべてが正常に機能しました。最初の質問を投稿したとき、エラーが発生read()
しないように、BeautifulSoupオブジェクトに機械化するために仮帆装を行う必要がありました。malformed start tag
これにより、BeautifulSoupオブジェクトの代わりにuencodestingが作成されました。古いBeautifulSoupで機械化コードを修正すると、目的の動作が発生しました。