2013-12-11 2 views
1

Я пытаюсь получить атрибут элементов, но все, что я получаю, - это значение 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')) 
+0

Вы должны попытаться разместить определенный бит кода, который служит примером вашей проблемы или создать иллюстративный пример. Было бы также полезно увидеть пример ввода, ожидаемый результат и фактический вывод. – msnider

+0

Это лучше. Это облегчает просмотр того, что вы пытались, и что пошло не так. Также было бы неплохо увидеть пример XML-элемента, который вы анализируете ... Каков вывод 3 'print'-операторов в последнем блоке' if'? – msnider

+0

Если вы просто запустите программу, она загрузит XML. Вы можете найти его на [reddit.com/.rss](http://reddit.com/.rss) Out put is '{http://search.yahoo.com/mrss/} title'' '{}' 'None' – ddaniels

ответ

1

Единственный тег, который имеет атрибут называется URL является СМИ: эскиз тега. И как вы указали, media объявлен в верхней части с xmlns:media="http://search.yahoo.com/mrss/". Это приводит меня к мысли, что ваша последняя, ​​если заявление должно быть:

if threadInfo.tag == '{http://search.yahoo.com/mrss/}thumbnail': 
    print(threadInfo.tag) 
    print(threadInfo.attrib) 
    print(threadInfo.get('url')) 

Который должен производить вывод:

'{http://search.yahoo.com/mrss/}thumbnail' 
{'url' : 'http://a.thumbs.redditmedia.com/cozEqqG9muj-tT3Z.jpg'} 
'http://a.thumbs.redditmedia.com/cozEqqG9muj-tT3Z.jpg' 
+1

В начале xml-носителя объявляется как {http://search.yahoo.com/mrss/}. Если вы измените его на «media: thumbnail», он никогда не найдет тег. – ddaniels

+0

Хорошо, думаю, я вижу вашу проблему. Попробуйте мой обновленный ответ. – msnider

+0

Yup, который работает. Не помню, чтобы изменить его на миниатюру. Спасибо! – ddaniels

Смежные вопросы