Вы имеете в виду что-то подобное?
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:
- Кодировка, которую вы передаете в качестве аргумента fromEncoding для конструктора супа.
- Кодировка обнаружена в самом документе: например, в декларации XML или (для документов HTML) мета-теге http-эквивалент. Если Beautiful Soup находит кодировку такого типа в документе, он снова анализирует документ с самого начала и пробует новую кодировку. Единственное исключение - если вы явно указали кодировку, и эта кодировка действительно сработала: тогда она будет игнорировать любую кодировку, найденную в документе.
- Кодировка, которую вынюхивают, просматривая первые несколько байтов файла. Если на этом этапе обнаружена кодировка, это будет одна из кодировок UTF- *, EBCDIC или ASCII.
- Кодировка, обнаруженная библиотекой chardet, если она установлена.
- UTF-8
- Windows-1252
Прекрасный суп почти всегда будет угадывать, если он вообще может угадать. Но для документов без деклараций и в странных кодировках его зачастую невозможно угадать.
N.B. Пункт № 2, который я прочитал как: BeautifulSoup будет автоматически использовать кодировку в объявлении xml, если вы явно не укажете кодировку с аргументом fromEncoding. YMMV.
Существуют и другие, потенциально полезные примеры, связанные с юникодом, в ранее упомянутой документации .
Редактировать : @TorelTwiddler, если есть другой способ добавить объявление xml, используя BeautifulSoup, не передавая тег в виде строки напрямую, я не знаю об этом.
Тем не менее рассмотрим следующее:
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>
Возможно, это поможет вам добраться туда, куда вы хотите.