#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)