我正在使用PYTHON类和The ElementTree XML
这是我目前为止的代码:
class Story():
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
解析XML代码:
import urllib.request
import xml.etree.ElementTree as ET
url = 'https://www.yahoo.com/news/rss'
with urllib.request.urlopen(url) as response:
data = response.read()
root = ET.fromstring(data)
channel = root[0]
for news_title in channel.iter('title'):
print(news_title.text + 'n')
for news_pub_date in channel.iter('pubDate'):
print(news_pub_date.text + 'n')
for news_link in channel.iter('link'):
print(news_link.text + 'n')
我可以打印标题、公开日期和链接,但它们是分开的。那么,我如何结合类将内容存储在列表中以打印这样的结果:
白宫有132个房间和自己的餐厅。以下是乔·拜登的新家。https://news.yahoo.com/us炸弹-设备-叙利亚-使用- 003717572. - html
为什么德克萨斯州的暴风雪吸引了反拜登的阴谋论?(2021 - 02 - 26 - t00:37:17z)https://news.yahoo.com/sturgeon爆炸-萨尔蒙德-面临索赔- 193113374. - html
这个问题的要求是我需要创建一个def来获取内容并将其返回到列表中:
def get_contents(source='yahoo') -> List[content]:
contents = []
# Do some code here
return contents
谢谢你的帮助。
下面是针对您提供的XML的更有效的列表推导:
contents = [[ch[0].text,ch[1].text, ch[2].text] for ch in channel[8:]]
这与下面的代码相同,但不需要遍历每个标题、pubDate或链接。
这似乎是使用列表推导式(old)的可行解决方案:
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)]
您可以使用findall()
获得所有item
元素,然后使用find()
从每个item
中获得title
,link
和pubDate
子元素,例如:
import urllib.request
import xml.etree.ElementTree as ET
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'):
print(item.find('title').text)
print(item.find('link').text)
print(item.find('pubDate').text)
print()