5

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で機械化コードを修正すると、目的の動作が発生しました。

4

1 に答える 1

2

BeautifulSoupを使用した例を次に示します。

from BeautifulSoup import BeautifulSoup

soup = BeautifulSoup('<textarea name="classified_description"></textarea>')
soup.find('textarea', {'name': 'classified_description'}).insert(0, 'value')
assert str(soup) == '<textarea name="classified_description">value</textarea>'

解析ツリーの変更に関するBeautifulSoupのドキュメントでは、このような変換について詳しく説明しています。

于 2012-08-12T06:35:18.793 に答える