BeautifulSoup: Как включить кодировку на выходе? - PullRequest
4 голосов
/ 18 августа 2011

Я хотел бы включить тег кодирования в документ 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 Ответ

0 голосов
/ 18 августа 2011

Вы имеете в виду что-то подобное?

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>

Возможно, это поможет вам добраться туда, куда вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...