1

BeautifulSoup4 の使用に問題があります... (私はかなり Python/BeautifulSoup の初心者なので、ばかげている場合はご容赦ください)

次のコードはなぜですか:

from bs4 import BeautifulSoup

soup_ko = BeautifulSoup('<select><option>foo</option><option>bar & baz</option><option>qux</option></select>')
soup_ok = BeautifulSoup('<select><option>foo</option><option>bar and baz</option><option>qux</option></select>')

print soup_ko.find_all('option')
print soup_ok.find_all('option')

次の出力を生成します。

[<option>foo</option>, <option>bar &amp; baz</option>]
[<option>foo</option>, <option>bar and baz</option>, <option>qux</option>]

私は同じ結果、私の 3 つのオプションの配列を期待していました...しかし、BeautifulSoup はテキストのアンパサンドを嫌うようですか? HTML を編集せずに (または変換/変換することによって)、これを取り除き、正しい配列を取得するにはどうすればよいですか?

ありがとう、

編集: 4.2.0 のバグのようです... 4.2.0 と 4.2.1 の両方のバージョンをダウンロードしました ( http://www.crummy.com/software/BeautifulSoup/bs4/download/4.2/beautifulsoup4-4.2.0から) .tar.gzおよびhttp://www.crummy.com/software/BeautifulSoup/bs4/download/4.2/beautifulsoup4-4.2.1.tar.gz ) をスクリプト フォルダーに解凍し、コードを次のように変更します。

import sys
sys.path.insert(0, "beautifulsoup4-" + sys.argv[1])
from bs4 import BeautifulSoup, __version__

print "Beautiful Soup %s" % __version__
soup_ko = BeautifulSoup('<select><option>foo</option><option>bar & baz</option><option>qux</option></select>')
print soup_ko.find_all('option')

そして結果を得ました:

15:24:38 pataluc ~ % python stack.py 4.2.0
Beautiful Soup 4.2.0
[<option>foo</option>, <option>bar &amp; baz</option>]
15:24:41 pataluc ~ % python stack.py 4.2.1
Beautiful Soup 4.2.1
[<option>foo</option>, <option>bar &amp; baz</option>, <option>qux</option>]

私の質問は閉じられていると思います。バージョンの問題だと気づかせてくれたコメントに感謝します。

4

3 に答える 3

2

&いわゆるHTML エンティティを入力するために HTML で使用されます。たとえば、<タグを開始する HTML の特殊な記号なので、&lt;代わりに使用します。

したがって、&それ自体も特別な記号であり&amp;、リテラルのアンパサンドとして使用する必要があります。あなたの HTML は無効で、BeautifulSoup が修正しました。

于 2013-06-05T12:28:58.390 に答える
1

編集した最初の投稿で言ったように、これは BeautifulSoup 4.2.0 のバグでした。4.2.1 をダウンロードしたところ、バグはなくなりました。

于 2013-06-18T12:10:45.250 に答える