С помощью BeautifulSoup, чтобы извлечь содержимое CDATA


Я пытаюсь использовать BeautifulSoup из bs4/Python 3 для извлечения CData. Однако всякий раз, когда я ищу его, используя следующее, он возвращает пустой результат. Может ли кто-нибудь указать, что я делаю не так?

from bs4 import BeautifulSoup,CData

txt = '''<foobar>We have
         <![CDATA[some data here]]>
         and more.
         </foobar>'''
soup = BeautifulSoup(txt)
for cd in soup.findAll(text=True):
    if isinstance(cd, CData):
        print('CData contents: %r' % cd)
1 3

1 ответ:

Проблема, по-видимому, заключается в том, что синтаксический анализатор по умолчанию не анализирует CDATA должным образом. Если вы укажете правильный синтаксический анализатор, CDATA отобразится:

soup = BeautifulSoup(txt,'html.parser')

Для получения дополнительной информации о парсерах см. документы

Я добрался до этого с помощью функции diagnose , которую рекомендуют docs :

Если у вас возникли вопросы о прекрасном супе или возникли проблемы, отправьте письмо в дискуссионную группу. Если ваша проблема связана с синтаксическим анализом HTML-документа, будьте обязательно упомяните, что функция diagnose() говорит об этом документе.

С помощью функции diagnose() можно получить вывод о том, как различные синтаксические анализаторы видят ваш html, что позволяет выбрать правильный синтаксический анализатор для вашего варианта использования.