17

3 より前の BeautifulSoup バージョンでは、HTML の任意のチャンクを取得して、次の方法で文字列表現を取得できました。

from BeautifulSoup import BeautifulSoup
soup3 = BeautifulSoup('<div><b>soup 3</b></div>')
print unicode(soup3)
    '<div><b>soup</b></div>'

ただし、BeautifulSoup4 では、同じ操作で追加のタグが作成されます。

from bs4 import BeautifulSoup
soup4 = BeautifulSoup('<div><b>soup 4</b></div>')
print unicode(soup4)
    '<html><body><div><b>soup 4</b></div></body></html>'
     ^^^^^^^^^^^^                        ^^^^^^^^^^^^^^ 

<html><body>..</body></html>BS4 が追加している外部タグは必要ありません。BS4 ドキュメントを調べ、クラス内も検索しましたが、出力で余分なタグを抑制する設定が見つかりませんでした。どうすればいいのですか?BS3 で使用されている SGML パーサーは、BS4 で使用可能なlxmlまたはパーサーほど優れていないため、v3 へのダウングレードはオプションではありません。html5lib

4

2 に答える 2

8

インストールされているパーサーなどに関係なく、コードをすべてのマシンで動作させたい場合 ( 2.9 と 2.8lxmlでビルドされた同じバージョンのlibxml2動作は大きく異なります。stdlib にhtml.parserは 2.7.2 と 2.7 の間でいくつかの根本的な変更がありました。 .3, …)、すべての正当な結果を処理する必要があります。

フラグメントがあることがわかっている場合、次のようなもので正確にそのフラグメントが得られます。

soup4 = BeautifulSoup('<div><b>soup 4</b></div>')
if soup4.body:
    return soup4.body.next
elif soup4.html:
    return soup4.html.next
else:
    return soup4

もちろん、フラグメントが単一divの であることがわかっている場合はさらに簡単ですが、それがわかっているユースケースを考えるのは簡単ではありません。

soup4 = BeautifulSoup('<div><b>soup 4</b></div>')
return soup4.div

なぜこれが起こるのか知りたい場合:

BeautifulSoupHTML ドキュメントの解析を目的としています。HTML フラグメントは有効なドキュメントではありません。これはドキュメントにかなり近いものですが、与えたものが正確に返されることを保証するには十分ではありません。

パーサー間の違いが言うように:

HTML パーサーにも違いがあります。Beautiful Soup に完全な形式の HTML ドキュメントを渡せば、これらの違いは問題になりません。あるパーサーは別のパーサーよりも高速ですが、元の HTML ドキュメントとまったく同じように見えるデータ構造をすべて提供します。

しかし、ドキュメントが完全に形成されていない場合、パーサーが異なれば結果も異なります。

したがって、この正確な違いは文書化されていませんが、それは何かの特殊なケースにすぎません.

于 2013-04-12T21:54:22.320 に答える
1

古いBeautifulStoneSoup のドキュメントに記載されているように:

BeautifulSoup クラスは、HTML 作成者の意図を推測するための Web ブラウザーのようなヒューリスティックでいっぱいです。しかし、XML には固定タグ セットがないため、これらのヒューリスティックは適用されません。そのため、BeautifulSoup は XML をうまく処理できません。

BeautifulStoneSoup クラスを使用して、XML ドキュメントを解析します。これは、XML の方言に関する特別な知識がなく、タグのネストに関する非常に単純な規則を備えた一般的なクラスです...

そしてBeautifulSoup4 docsで:

XML を解析するための BeautifulStoneSoup クラスはなくなりました。XML を解析するには、BeautifulSoup コンストラクターの 2 番目の引数として「xml」を渡します。同じ理由で、BeautifulSoup コンストラクターは isHTML 引数を認識しなくなりました。

おそらくそれはあなたが望むものをもたらすでしょう。

于 2013-04-12T21:29:29.857 に答える