lxml
ビルダーを使用すると、Python 2.7で非再帰的なbs4.BeautifulSoup.find_all
を実行できないことがわかりました。lxmlビルダーでの非再帰的な検索
は、次の例のHTMLスニペットを取る:
<p> <b> Cats </b> are interesting creatures </p>
<p> <b> Dogs </b> are cool too </p>
<div>
<p> <b> Penguins </b> are pretty neat, but they're inside a div </p>
</div>
<p> <b> Llamas </b> don't live in New York </p>
は、私が直接の子であるすべてのp
の要素を見つけたいと言います。私はfind_all
をfind_all("p", recursive=False)
と再帰的に行います。
これをテストするために、上記のHTMLスニペットをhtml
という変数に設定しました。
a = bs4.BeautifulSoup(html, "html.parser")
b = bs4.BeautifulSoup(html, "lxml")
通常find_all
を使用したとき、彼らの両方が正しく実行します:その後、私は2つのBeautifulSoup
インスタンス、a
とb
作成
>>> a.find_all("p")
[<p> <b> Cats </b> are interesting creatures </p>, <p> <b> Dogs </b> are cool too </p>, <p> <b> Penguins </b> are pretty neat, but they're inside a div </p>, <p> <b> Llamas </b> don't live in New York </p>]
>>> b.find_all("p")
[<p> <b> Cats </b> are interesting creatures </p>, <p> <b> Dogs </b> are cool too </p>, <p> <b> Penguins </b> are pretty neat, but they're inside a div </p>, <p> <b> Llamas </b> don't live in New York </p>]
を私は再帰的な発見、唯一a
作品をオフにした場合。 b
は空のリストを返します。
>>> a.find_all("p", recursive=False)
[<p> <b> Cats </b> are interesting creatures </p>, <p> <b> Dogs </b> are cool too </p>, <p> <b> Llamas </b> don't live in New York </p>]
>>> b.find_all("p", recursive=False)
[]
なぜですか?これはバグですか、何か間違っていますか? lxml
ビルダーは非再帰的にfind_all
をサポートしていますか?
これは私には矛盾しているようですが、なぜこのように異なるパーサーが異なる動作をするべきですか? –
@ LukeTaylorそれは混乱するかもしれない、私は同意する。 [Parser間の違い](http://www.crummy.com/software/BeautifulSoup/bs4/doc/#differences-between-parsers)のドキュメントの段落には、いくつかの情報があります。それはすべて、違うパーサーに送られ、非整形式のHTMLを有効なものにします。 – alecxe