Проблема заключается в том, как bs4 обрабатывает CData (это довольно хорошо задокументировано, но не очень решено).
Вам нужно будет импортировать CData из bs4, что поможет извлечь CData в виде строки и использовать html .parser library, оттуда создайте новый объект bs4 с этой строкой, чтобы присвоить ему атрибут findAll и переберите его содержимое.
from bs4 import BeautifulSoup, CData
import requests
url="https://www.milenio.com/rss"
source=requests.get(url)
soup = BeautifulSoup(source.content, 'html.parser')
items=soup.findAll('item')
for item in items:
html_text = item.description
findCdata = html_text.find(text=lambda tag: isinstance(tag, CData))
newSoup = BeautifulSoup(findCdata, 'html.parser')
paragraphs = newSoup.findAll('p')
for p in paragraphs:
print(p.get_text())
Edit: OP, необходимый для извлечения текста ссылки и обнаружил, что это возможно только внутри элемента l oop с использованием link = item.link.nextSibling
, потому что содержимое ссылки прыгает за пределы своего тега, как, например, </link>http://www...
. В древовидном представлении XML этот конкретный XML do c показал раскрывающийся список для элемента ссылки, который, вероятно, является причиной.
Чтобы получить содержимое из других тегов внутри документа, которые не отображают в раскрывающемся списке XML в виде дерева и без вложенных CData преобразовать тег в нижний регистр и вернуть текст как обычно:
item.pubdate.get_text() # Gets contents the tag <pubDate>
item.author.get_text() # Gets contents of the tag <author>