2012-07-06 42 views
1

我有一個包含一個html:BeautifulSoup <b>大膽</b>標籤失敗

<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文件的佈局,所以丟失標籤是相當令人沮喪的。爲什麼會發生這種情況,最好的辦法是什麼來阻止它?幫助很多appriciated!

編輯:我需要處理嚴重形成的HTML文件的信息提取目的。如果他們的創建者想要將某些文本變爲粗體,那麼即使該人創建了無效的html,我也必須將其考慮在內。

回答

4

該HTML無效。 <b>內不能有<p>。 BeautifulSoup正在嘗試執行錯誤恢復(就像瀏覽器一樣)。

停止它的最好方法是fix the HTML

+1

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

有一個Python版本在這裏出現@root - 您的瀏覽器以不同的方式從BeautifulSoup中恢復錯誤。修復HTML。 – Quentin 2012-07-06 14:23:28

-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> 
+0

我沒有創建這些文檔。我需要閱讀它們中的結構化文本! – root 2012-07-06 14:24:19

0

您可以嘗試html5lib而不是BeautifulSoup。 Html5lib實現了HTML5解析器算法,因此它應該可以生成與現代瀏覽器相同的DOM。

聲明:我沒有嘗試html5lib解析器爲自己,所以我不知道它是目前的穩定水平。

+0

謝謝,會試試看。 – root 2012-07-06 14:41:06

+1

您也可以使用Beautiful Soup 4,它允許您使用html5lib解析文檔,然後在生成的數據結構上使用Beautiful Soup API。 – 2012-07-06 15:31:24