7

BeautifulSoup を使用して、次の html のオプション テキストを取得したいと考えています。例: 2002/12 、 2003/12 などを取得したい

<select id="start_dateid">
<option value="0">2002/12</option>
<option value="1">2003/12</option>
<option value="2">2004/12</option>
<option value="3">2005/12</option>
<option value="4">2006/12</option>
<option value="5" selected="">2007/12</option>
<option value="6">2008/12</option>
<option value="7">2009/12</option>
<option value="8">2010/12</option>
<option value="9">2011/12</option>
</select>

コンテンツを取得する最良の方法は何ですか? 現在、次のコードを使用していますが、そのために美しいスープを使用する方法がわかりません。html ファイルに複数の領域が選択されている場合、結果は正しくありません。これが私がこれまでに持っているものです:

    import urllib2
    from bs4 import BeautifulSoup
    import lxml

    soup = BeautifulSoup(urllib2.urlopen("./test.html").read(),"lxml");
    for item in soup.find_all('option'):
            print(''.join(str(item.find(text=True))));
4

2 に答える 2

16

ここを使う必要はありませんlxml。私のマシンにインストールするのに問題があるため、私の答えはそれを利用していません。

from bs4 import BeautifulSoup as BS
import urllib2

soup = BS(urllib2.urlopen("./test.html").read())
contents = [str(x.text) for x in soup.find(id="start_dateid").find_all('option')]

これにより、最初に によって制限しているため、html ファイル内の複数の選択領域の問題を回避できます。これによりid='start_dateid'、権利があることが保証されます。これは、<select>各 html ドキュメント内で、各 html 要素が一意のid属性を持っている必要があるためです。id属性。次に、その<option>タグ内のみですべてのタグを検索し、それぞれからすべての値を取得します。 <select><option>

于 2012-11-25T20:48:20.363 に答える
4

代わりにタグを選択selectし、含まれている文字列要素をループします。

import urllib2
from bs4 import BeautifulSoup
import lxml

soup = BeautifulSoup(urllib2.urlopen("./test.html").read(),"lxml");
select = soup.find('select', id="start_dateid")
for value in select.stripped_strings:
    print value

少し近道ですselect.find_all('option')代わりにループして、それぞれからプロパティを取得することもできますが.text、とにかく他の要素が存在しないため、文字列 iterable に直行して、それで完了しないでください。結局のところ、タグでは<option><optgroup>タグのみが許可され、<select>タグのみ<option>がテキストを保持します。

対話型インタープリターからの出力:

>>> select = soup.find('select', id="start_dateid")
>>> for value in select.stripped_strings:
...     print value
... 
2002/12
2003/12
2004/12
2005/12
2006/12
2007/12
2008/12
2009/12
2010/12
2011/12

これをリストに変換する必要がある場合は、次を使用します。

values = list(select.stripped_strings)
于 2012-11-25T20:50:02.170 に答える