BeautifulSoup:如何在输出中包含编码?
我想在一个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>
也许这能帮助你达到想要的效果。