2011-08-17 32 views
4

我想在使用BeautifulSoup.BeautifulStoneSoup的XML文檔中包含編碼標籤,但我不知道該怎麼做!BeautifulSoup:如何在輸出中包含編碼?

<?xml version="1.0" encoding="UTF-8"?> 
<mytag>stuff</mytag> 

它在輸出編碼標籤,當我閱讀已經有它的文檔,但我正在做一個新的湯。

謝謝!

編輯:我將舉一個我目前正在做的事情的例子。

from BeautifulSoup import BeautifulStoneSoup, Tag 
soup = BeautifulStoneSoup() 
mytag = Tag(soup, 'mytag') 
soup.append(mytag) 

str(soup) 
# '<mytag></mytag>' 

soup.prettify() # No encoding given 
# '<mytag>\n</mytag>' 

soup.prettify(encoding='UTF-8') 
# '<mytag>\n</mytag>' # Where's the encoding? 

即使我創建湯像BeautifulStoneSoup(fromEncoding='UTF-8'),但仍然沒有<?xml?>標籤。

是否有另一種方式來獲得該標籤沒有創建並直接將標籤作爲字符串傳遞,或者是唯一的方法?

+0

美麗的湯不是一個XML *生成器*。美化方法只是爲了方便。爲什麼不直接使用lxml? – zwol

+0

@Zack:部分原因是因爲我執行的幾乎所有XML用法都是解析,所以BeautifulSoup聽起來像是一個好主意;部分原因是所有的建築方法已經被設置爲與BeautifulSoup一起使用,所以重寫它們聽起來不太吸引人。但我一定會記得下次嘗試lxml。 – TorelTwiddler

回答

0

你的意思是這樣的嗎?

from BeautifulSoup import BeautifulStoneSoup 
soup = BeautifulStoneSoup('<?xml version="1.0" encoding="UTF-8"?>') 
# make some more soup 

或者,

soup = BeautifulStoneSoup() 
# make some more soup 
soup.insert(0, '<?xml version="1.0" encoding="UTF-8"?>') 

從BeautifulSoup documentation

美麗的湯嘗試以下編碼,按優先順序,把你的文件轉換成Unicode:

  • 您作爲fromEncoding參數傳遞給湯構造函數的編碼。
  • 在文檔本身中發現的編碼:例如,在XML聲明中或(對於HTML文檔)一個http-equiv META標籤。如果Beautiful Soup在文檔中發現這種編碼,它會從頭開始再次解析文檔,並嘗試新編碼。唯一的例外是,如果您明確指定了編碼,並且該編碼實際上起作用:那麼它將忽略它在文檔中找到的任何編碼。
  • 通過查看文件的前幾個字節來查看編碼。如果在此階段檢測到編碼,它將是UTF- *編碼,EBCDIC或ASCII之一。
  • 由chardet庫嗅探的編碼(如果已安裝它)。
  • UTF-8
  • 的Windows 1252

美麗的湯幾乎總是猜對了,如果它可以做一個猜測的。但對於沒有聲明和奇怪編碼的文檔,通常無法猜測。

N.B.項目#2,我讀作:BeautifulSoup會自動使用xml聲明中的編碼,如果您沒有顯式指定一個帶fromEncoding參數的編碼。因人而異。

在前面引用的documentation中還有其他可能有用的與unicode相關的示例。


編輯:@TorelTwiddler,如果有另一種方式來增加使用BeautifulSoup XML聲明,而沒有經過標籤作爲直接的字符串,我沒有意識到這一點。

儘管如此,考慮以下因素:

soup = BeautifulStoneSoup('<?xml version="1.0" encoding=""?>') # <- no encoding 
mytag = Tag(soup, 'mytag') 
soup.append(mytag) 

print str(soup) 
# "<?xml version='1.0' encoding='utf-8'?><mytag></mytag>" 
# Wha!? :) 
print soup.prettify(encoding='euc-jp') 
# <?xml version='1.0' encoding='euc-jp'?> 
# <mytag> 
# </mytag> 

也許,你想要去的那會幫助你。

+0

那麼我需要特別插入格式化標籤?它沒有根據我給它的編碼算出來嗎? – TorelTwiddler

+1

@TorelTwiddler我不確定我是否遵循你的問題。你已經'給''編碼?或想知道在哪裏「給」它? – Marty

+0

我已經用更多信息更新了這個問題,並希望能更直接地回答我所尋找的內容。 – TorelTwiddler