2017-03-24 57 views
1

HTML有一個空元素的概念,如MDN上列出。然而,美麗的湯似乎沒有妥善處理:正確地使用美麗的湯解析空html標記

import bs4 

soup = bs4.BeautifulSoup(
    '<div><input name=the-input><label for=the-input>My label</label></div>', 
    'html.parser' 
) 
print(soup.contents) 

我得到:

[<div><input name="the-input"><label for="the-input">My label</label></input></div>] 

即輸入包裝了標籤。

問題:有沒有什麼辦法可以得到美麗的湯來正確解析這個問題?還是有沒有找到我還沒找到的這種行爲的官方解釋?

至少,我希望是這樣的:

[<div><input name="the-input"></input><label for="the-input">My label</label></div>] 

即輸入在標籤之前自動關閉。

回答

3

在他們的documentationhtml5lib指出解析文檔作爲Web瀏覽器(在這種情況下,如lxml)。它會嘗試通過在需要時添加/關閉標籤來修復文檔樹。

在您的例子我使用LXML作爲解析器和它給了以下結果:

soup = bs4.BeautifulSoup(
'<div><input name=the-input><label for=the-input>My label</label></div>', 
'lxml' 
) 
print(soup.body.contents) 

[<div><input name="the-input"/><label for="the-input">My label</label></div>] 

注意lxml添加HTML &體標籤,因爲它們沒有出現在源,這就是爲什麼我已經打印了body的內容。

+0

謝謝,有用的鏈接要注意! – daphtdazz

3

我會說湯正在做它可以修復這個html結構,它在某些場合實際上是有幫助的。

無論如何,對於你的情況,我會說使用lxml,這將解析HTML結構,只要你想,也許給一個嘗試parsel