Я пытаюсь получить атрибут элементов, но все, что я получаю, - это значение None или пустой список в зависимости от того, что я пытаюсь его получить. Кроме того, если кто-то знает лучший способ получить конкретный тег для элемента, я бы его оценил. Вот код и разнесенная часть - это то, что должно вернуть URL, но не делает.Получить атрибут XML, используя ElementTree Python
import xml.etree.ElementTree as ET
import webbrowser,time,urllib.request
import tkinter as tk
import urllib
# webbrowser.get('windows-default').open_new('http://www.reddit.com/'+'r/blender')
main = tk.Tk()
class Application(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.createWidgets()
self.initial()
def createWidgets(self):
# print('Went to createWidgets()')
self.send_entry = tk.Entry(self)
self.send_entry.grid(row=0,column=0)
self.change_sub = tk.Button(self,text='Change Subreddit', command=lambda :self.getXML(self.send_entry.get())).grid(row=0 , column=2)
self.lb_scrollY = tk.Scrollbar(self,orient=tk.VERTICAL)
self.lb_scrollY.grid(row=1,column=1,sticky=tk.NS)
self.thread_lb = tk.Listbox(self,yscrollcommand=self.lb_scrollY.set)
self.lb_scrollY['command']=self.thread_lb.yview
self.thread_lb.grid(row=1,column=0)
self.QUIT = tk.Button(self, text="QUIT", fg="red", command=main.destroy).grid(row=2)
def descStripper(self,desc):
x1=int(desc.find('alt="'))
if x1 != -1:
x2Start = x1+5
x2=int(desc.find('"',x2Start))
desc = desc[x1+5:x2]
return desc
else:
desc = "There is no description. Maybe it's a link"
return desc
def lbPopulator(self,title,pub,link):
# print('Went to lbPopulator()')
self.thread_lb.delete(0,tk.END)
for item in title:
self.thread_lb.insert(tk.END,item)
def getXmlData(self):
counter = 0
self.threadPubDateList = []
self.threadTitleList = []
self.threadLinkList = []
self.threadDescList = []
self.threadThumbNail = []
tree=ET.parse('rss.xml')
root=tree.getroot()
for channel in root:
for SubChannel in channel:
if SubChannel.tag == 'item':
for threadInfo in SubChannel:
# print(SubChannel.getchildren())
if threadInfo.tag == 'title':
self.threadTitleList.append(threadInfo.text)
if threadInfo.tag == 'pubDate':
self.threadPubDateList.append(threadInfo.text[:-6])
if threadInfo.tag == 'link':
self.threadLinkList.append(threadInfo.text)
if threadInfo.tag == 'description':
self.threadDescList.append(self.descStripper(threadInfo.text))
if threadInfo.tag == '{http://search.yahoo.com/mrss/}title':
print(threadInfo.tag)
print(threadInfo.attrib)
print(threadInfo.get('url'))
self.lbPopulator(self.threadTitleList,self.threadPubDateList,self.threadLinkList)
# print(self.threadTitleList)
# print(self.threadPubDateList)
# print(self.threadLinkList)
# print(self.threadDescList)
def getXML(self,subreddit):
try:
url = 'http://www.reddit.com'+subreddit+'.rss'
source = urllib.request.urlretrieve(url,'rss.xml')
self.getXmlData()
except urllib.error.HTTPError as err:
print('Too many requests-Try again')
def initial(self):
try:
source = urllib.request.urlretrieve('http://www.reddit.com/.rss','rss.xml')
self.getXmlData()
except urllib.error.HTTPError as err:
print('Too many requests-Trying again 3')
time.sleep(3)
self.__init__()
# main.geometry("250x150")
app = Application(master=main)
app.mainloop()
Вот бит кода, который должен быть возвращающей URL в миниатюре, когда был принят XML-файл. Это все последнее заявление «если», а все остальные работают нормально.
def getXmlData(self):
counter = 0
self.threadPubDateList = []
self.threadTitleList = []
self.threadLinkList = []
self.threadDescList = []
self.threadThumbNail = []
tree=ET.parse('rss.xml')
root=tree.getroot()
for channel in root:
for SubChannel in channel:
if SubChannel.tag == 'item':
for threadInfo in SubChannel:
# print(SubChannel.getchildren())
if threadInfo.tag == 'title':
self.threadTitleList.append(threadInfo.text)
if threadInfo.tag == 'pubDate':
self.threadPubDateList.append(threadInfo.text[:-6])
if threadInfo.tag == 'link':
self.threadLinkList.append(threadInfo.text)
if threadInfo.tag == 'description':
self.threadDescList.append(self.descStripper(threadInfo.text))
if threadInfo.tag == '{http://search.yahoo.com/mrss/}title':
print(threadInfo.tag)
print(threadInfo.attrib)
print(threadInfo.get('url'))
Вы должны попытаться разместить определенный бит кода, который служит примером вашей проблемы или создать иллюстративный пример. Было бы также полезно увидеть пример ввода, ожидаемый результат и фактический вывод. – msnider
Это лучше. Это облегчает просмотр того, что вы пытались, и что пошло не так. Также было бы неплохо увидеть пример XML-элемента, который вы анализируете ... Каков вывод 3 'print'-операторов в последнем блоке' if'? – msnider
Если вы просто запустите программу, она загрузит XML. Вы можете найти его на [reddit.com/.rss](http://reddit.com/.rss) Out put is '{http://search.yahoo.com/mrss/} title'' '{}' 'None' – ddaniels