2011-08-17 30 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