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

5 投票
1 回答
2306 浏览
提问于 2025-04-16 23:50

我想在一个XML文档里加入编码标签,使用的是BeautifulSoup.BeautifulStoneSoup,但我不太确定该怎么做!

<?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?>标签。

有没有其他方法可以得到这个标签,而不需要直接创建并传递这个标签的字符串,还是说这就是唯一的方法?

1 个回答

1

你是想要这样的东西吗?

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的文档

Beautiful Soup会按照优先顺序尝试以下编码,把你的文档转换成Unicode:

  • 你在创建soup对象时传入的fromEncoding参数指定的编码。
  • 文档本身发现的编码:比如在XML声明中,或者在HTML文档中的http-equiv META标签。如果Beautiful Soup在文档中找到这种编码,它会从头开始重新解析文档,并尝试新的编码。唯一的例外是,如果你明确指定了一个编码,并且这个编码确实有效,那么它会忽略文档中找到的任何编码。
  • 通过查看文件的前几个字节来猜测的编码。如果在这个阶段检测到编码,它会是某种UTF-*编码、EBCDIC或ASCII。
  • 如果你安装了chardet库,它会通过这个库来猜测编码。
  • UTF-8
  • Windows-1252

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

注意第2点,我理解为:如果你没有用fromEncoding参数明确指定编码,BeautifulSoup会自动使用XML声明中的编码。你的情况可能会有所不同。

在之前提到的文档中,还有其他一些可能有用的与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>

也许这能帮助你达到想要的效果。

撰写回答