2011-11-13 196 views
26

比方說,我有一個頁面div。我可以通過soup.find()輕鬆獲得該div。BeautifulSoup innerhtml?

現在我已經得到了結果,我想要打印出div的全部innerhtml:我的意思是,我需要一個字符串,其中包含所有的html標籤和文本,完全像我想要的字符串用obj.innerHTML與javascript取得聯繫。這可能嗎?

回答

11

選項之一可能是使用類似的東西:

innerhtml = "".join([str(x) for x in div_element.contents]) 
+1

的Unicode(x)的可能是更安全的 –

+1

還有一些其他的問題與此有關。首先它不會在字符串元素中轉義html實體(比如大於和小於)。其次,它會寫評論的內容而不是評論標籤本身。 – ChrisD

+0

添加另一個不使用@ChrisD註釋的原因:這將在包含非ASCII字符的內容上引發UnicodeDecodeError。 – Anthon

29

有,做近似DOMs innerHTML method一個未公開的函數:

def innerHTML(element): 
    return element.decode_contents(formatter="html") 

這在目前通過了所有的測試案例。也許有人應該更新文檔?

+4

這會將一些字符變成HTML實體。雖然可以使用默認的格式化程序('None')。 – Tgr

+1

這是正確的答案。 @ peewhy的回答不適用於ChrisD概述的原因。 – dbkaplun

+2

看起來像這已被重命名爲'renderContents'與稍微不同的參數'(編碼= DEFAULT_OUTPUT_ENCODING, prettyPrint = False,indentLevel = 0)' – highvolt

1

只是unicode(x)怎麼樣?似乎爲我工作。

編輯:這會給你外部的HTML而不是內在的。

+0

這將返回包含外部元素的div,而不僅僅是內容。 – Arany

+0

你說得對。現在把它留在這裏以防別人幫助別人。 –

-1

如果你只需要文字(不包括HTML標記),那麼你可以使用.text

soup.select("div").text