1

次を含むhtmlがあります。

<b>
<p align="left">TXT1</p>
</b>
<p align="left">
<b>NR1</b> 
<b>TXT2</b>
TXT3 
<b>TXT4</b>
TXT5
</p>

私がする時:

from BeautifulSoup import BeautifulSoup
html = urllib.urlopen('url')
htmlr = html.read()
soup = BeautifulSoup(htmlr)

print soup

私は何か違うものを手に入れます:

<p align="left">TXT1</p>
<p align="left">NR1 <b>TXT2</b> TXT3 <b>TXT4</b>
TXT5</p>

私はhtmlドキュメントのレイアウトを分析しているので、タグを失うのはかなりイライラします。なぜそれが起こっているのか、それを止める最善の方法は何ですか? 大いに感謝してください!

編集:情報抽出の目的で、不適切な形式の html ドキュメントを処理する必要があります。作成者がテキストを太字にしたい場合は、その人が無効な html を作成したとしても、それを考慮する必要があります。

4

4 に答える 4

4

HTML が無効です。<p>a の中に aを入れることはできません<b>。BeautifulSoup は (ブラウザーと同様に) エラー回復を実行しようとしています。

それを止める最善の方法は、 HTML を修正することです。

于 2012-07-06T14:13:31.350 に答える
1

HTML Tidyは、無効なHTMLを正しく修復しているようです。彼らはここにそれのウェブ実装を持っています:http://infohound.net/tidy/

入った:

<b><p>hello world</p></b>

そしてこの結果を得ました:

<p><b>hello world</b></p>

ここにPythonバージョンがあるようです: http ://www.egenix.com/products/python/mxExperimental/mxTidy/

于 2012-07-06T14:44:57.623 に答える
0

BeautifulSoup の代わりにhtml5libを試すことができます。Html5lib は HTML5 パーサー アルゴリズムを実装しているため、最新のブラウザーと同じ DOM が生成されるはずです。

免責事項: 私は html5lib パーサーを自分で試したことがないので、現在の安定性レベルについてはわかりません。

于 2012-07-06T14:32:23.210 に答える
-1

quentinが提案したのと同じ。

要素を太字にしたい場合は、タグ<p>の代わりにインラインCSSを使用してください。<b>

<p style='font-weight:bold;' align="left">TXT1</p>
<p align="left">
<b>NR1</b> 
<b>TXT2</b>
TXT3 
<b>TXT4</b>
TXT5
</p>
于 2012-07-06T14:20:03.243 に答える