Python BeautifulSoup:如何在输出中包含编码?

Python BeautifulSoup:如何在输出中包含编码?,python,beautifulsoup,Python,Beautifulsoup,我想使用BeautifulSoup.BeautifulStoneSoup将编码标记包含在XML文档中,但我不确定如何使用 <?xml version="1.0" encoding="UTF-8"?> <mytag>stuff</mytag> 东西 当我阅读一个已经有编码标签的文档时,它会输出编码标签,但我正在制作一个新的汤 谢谢 编辑:我将举一个我目前正在做的事情的例子 from BeautifulSoup import BeautifulStoneSo

我想使用
BeautifulSoup.BeautifulStoneSoup
将编码标记包含在XML文档中,但我不确定如何使用

<?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?
从BeautifulSoup导入BeautifulstoneSoop,标记
汤=美丽的汤
mytag=Tag(汤“mytag”)
soup.append(mytag)
str(汤)
# ''
soup.prettify()#未给出编码
#“\n”
汤。修饰(编码='UTF-8')
#“\n”#编码在哪里?
即使我创建了类似于
BeautifulStoneSoup(fromcodeding='UTF-8')
的汤,仍然没有
标记


是否有其他方法可以获取该标记而无需直接创建标记并将其作为字符串传递,或者这是唯一的方法?

您的意思是这样的吗

from BeautifulSoup import BeautifulStoneSoup
soup = BeautifulStoneSoup('<?xml version="1.0" encoding="UTF-8"?>')
# make some more soup
从BeautifulSoup导入BeautifulStoneSoup
汤=美汤汤汤(“”)
#再煮些汤
或者

soup=BeautifulStoneSoup()
#再煮些汤
汤。插入(0,,)

来自BeautifulSoup:

Beauty Soup按优先级顺序尝试以下编码,以将文档转换为Unicode:

  • 作为fromEncoding参数传递给soup构造函数的编码
  • 在文档本身中发现的编码:例如,在XML声明或(对于HTML文档)http等价元标记中。如果Beautiful Soup在文档中找到这种编码,它会从一开始就再次解析文档,并尝试使用新的编码。唯一的例外是,如果您显式指定了一种编码,并且该编码确实有效:那么它将忽略在文档中找到的任何编码
  • 通过查看文件的前几个字节嗅探到的编码。如果在此阶段检测到编码,它将是UTF-*编码、EBCDIC或ASCII之一
  • chardet库嗅探到的编码(如果已安装)
  • UTF-8
  • Windows-1252
美丽的汤几乎总是猜对了,如果它能猜到的话。但是对于没有声明和使用奇怪编码的文档,它通常无法猜测

注意:第2项,我读作:BeautifulSoup将自动使用xml声明中的编码,如果您没有使用fromEncoding参数显式指定编码。YMMV

在前面的参考文献中,还有其他可能有用的与unicode相关的示例


Edit:@TorelTwiddler,如果有其他方法可以使用BeautifulSoup添加xml声明,而不直接将标记作为字符串传递,我不知道

P>以上所说的,考虑如下:

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>

soup=BeautifulStoneSoup(“”)#那么我需要专门插入格式化的标记吗?根据我在任何地方给它的编码,它都没有找到答案?@Toreltwidler我不确定我是否明白你的问题。您是否已经“给出”了编码?或者想知道在哪里“给出”它?我已经用更多的信息更新了这个问题,希望能更直接地回答我要找的问题。Beautiful Soup不是一个XML生成器。这种修饰方法只是为了方便。为什么不直接使用lxml?@Zack:部分原因是我执行的几乎所有XML使用都是解析,所以BeautifulSoup听起来是个好主意;部分原因是,所有的建筑方法都已经设置好用于BeautifulSoup,因此重写它们听起来并不吸引人。不过下次我一定会记得试试lxml。
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>