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

Tor*_*ler 5 python beautifulsoup

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

<?xml version="1.0" encoding="UTF-8"?>
<mytag>stuff</mytag>
Run Code Online (Sandbox Code Playgroud)

当我阅读已经有它的文档时,它会输出编码标签,但我正在制作新汤。

谢谢!

编辑:我将举例说明我目前正在做的事情。

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?
Run Code Online (Sandbox Code Playgroud)

即使我创建了这样的汤BeautifulStoneSoup(fromEncoding='UTF-8'),仍然没有<?xml?>标签。

有没有另一种方法可以在不直接创建和传递标签作为字符串的情况下获取该标签,还是唯一的方法?

Mar*_*rty 1

你的意思是这样的吗?

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

或者,

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

来自 BeautifulSoup文档

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

  • 作为 fromEncoding 参数传递给 soup 构造函数的编码。
  • 在文档本身中发现的编码:例如,在 XML 声明中或(对于 HTML 文档)http-equiv META 标记中。如果 Beautiful Soup 在文档中发现这种编码,它会从头开始再次解析文档并尝试新的编码。唯一的例外是,如果您显式指定了编码,并且该编码实际上有效:那么它将忽略在文档中找到的任何编码。
  • 通过查看文件的前几个字节来嗅探编码。如果在此阶段检测到编码,它将是 UTF-* 编码、EBCDIC 或 ASCII 之一。
  • chardet 库嗅探到的编码(如果已安装)。
  • UTF-8
  • Windows-1252

如果 Beautiful Soup 能猜的话,它几乎总是能猜对。但对于没有声明和奇怪编码的文档,它通常无法猜测。

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

早期引用的文档中还有其他可能有用的 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>
Run Code Online (Sandbox Code Playgroud)

也许这会帮助你到达你想去的地方。