Как создать объект по классу и получить информацию из списка в Python?

#python #list #class #elementtree

#python #Список #класс #elementtree

Вопрос:

Я работаю на Python с class и ElementTree

У меня есть функция для получения новостей из Yahoo XML, включающая заголовок, дату публикации и ссылку, после чего я сохранил их в списке:

 import urllib.request
import xml.etree.ElementTree as ET

def get_contents():
    url = 'https://www.yahoo.com/news/rss'

    with urllib.request.urlopen(url) as response:
        data = response.read()
        root = ET.fromstring(data)
        channel = root[0]
        titles = [nt.text for nt in channel.iter('title')]
        dates = [pd.text for pd in channel.iter('pubDate')]
        links = [nl.text for nl in channel.iter('link')]
        contents = [[titles[i], dates[i], links[i]] for i in range(len(titles) - 1)]

    return contents
 

У меня также есть содержимое класса, которое включает функцию init для объявления заголовка, даты публикации и ссылки. Кроме того, у меня есть функция str для получения строки формата объекта, если я их создаю:

 class Content():
    def __init__(self, title, link, pub_date):
        # TODO: your code here
        self.title = title
        self.link = link
        self.pub_date = pub_date
    def __str__(self):
        # TODO: your code here
        return self.title   '. ('   self.pub_date   ')'   'n'   self.link
 

Теперь я хочу создать объект с помощью класса Content() и получить заголовок, общедоступную дату и ссылку по имеющемуся у меня списку (в возврате функции get_contents()), например:

Спасибо за вашу помощь.

Ответ №1:

Вместо создания списка значений вы можете просто создать элемент содержимого напрямую, а затем распечатать его:

 import urllib.request
import xml.etree.ElementTree as ET

class Content():
    def __init__(self, title, link, pub_date):
        self.title = title
        self.link = link
        self.pub_date = pub_date
    def __str__(self):
        return self.title   '. ('   self.pub_date   ')'   'n'   self.link

def get_contents():
    url = 'https://www.yahoo.com/news/rss'

    with urllib.request.urlopen(url) as response:
        data = response.read()
        root = ET.fromstring(data)
        for item in root.findall("./channel/item"):
            title = item.findtext("title")
            pubDate = item.findtext("pubDate")
            link = item.findtext("link")
            yield Content(title, link, pubDate)


for content in get_contents():
    print(content)
 

Кроме того, вы можете сэкономить немного времени, используя стороннюю библиотеку, например feedparser , для анализа RSS-канала:

 import feedparser
def get_contents():
    url = 'https://www.yahoo.com/news/rss'
    feed = feedparser.parse(url)
    for item in feed.entries:
        yield Content(item.title, item.link, item.published)