- Samotný formát RSS je relativně snadno čitelný jak pro automatizované procesy, tak pro lidi.
- RSS zpracovaný v tomto tutoriálu je RSS kanál s hlavními zprávami z oblíbeného zpravodajského webu. Můžete to zkontrolovat zde . Naším cílem je zpracovat tento RSS zdroj (nebo XML soubor) a uložit jej v nějakém jiném formátu pro budoucí použití.
#Python code to illustrate parsing of XML files # importing the required modules import csv import requests import xml.etree.ElementTree as ET def loadRSS(): # url of rss feed url = 'http://www.hindustantimes.com/rss/topnews/rssfeed.xml' # creating HTTP response object from given url resp = requests.get(url) # saving the xml file with open('topnewsfeed.xml' 'wb') as f: f.write(resp.content) def parseXML(xmlfile): # create element tree object tree = ET.parse(xmlfile) # get root element root = tree.getroot() # create empty list for news items newsitems = [] # iterate news items for item in root.findall('./channel/item'): # empty news dictionary news = {} # iterate child elements of item for child in item: # special checking for namespace object content:media if child.tag == '{https://video.search.yahoo.com/mrss': news['media'] = child.attrib['url'] else: news[child.tag] = child.text.encode('utf8') # append news dictionary to news items list newsitems.append(news) # return news items list return newsitems def savetoCSV(newsitems filename): # specifying the fields for csv file fields = ['guid' 'title' 'pubDate' 'description' 'link' 'media'] # writing to csv file with open(filename 'w') as csvfile: # creating a csv dict writer object writer = csv.DictWriter(csvfile fieldnames = fields) # writing headers (field names) writer.writeheader() # writing data rows writer.writerows(newsitems) def main(): # load rss from web to update existing xml file loadRSS() # parse xml file newsitems = parseXML('topnewsfeed.xml') # store news items in a csv file savetoCSV(newsitems 'topnews.csv') if __name__ == '__main__': # calling main function main()
Above code will: - Načtěte zdroj RSS ze zadané adresy URL a uložte jej jako soubor XML.
- Analyzujte soubor XML a uložte zprávy jako seznam slovníků, kde každý slovník představuje jednu novinku.
- Uložte novinky do souboru CSV.
- Můžete se podívat na více RSS kanálů zpravodajského webu použitého ve výše uvedeném příkladu. Můžete se pokusit vytvořit rozšířenou verzi výše uvedeného příkladu analýzou jiných rss kanálů.
- Jste fanouškem kriketu? Pak tento rss feed vás musí zajímat! Tento soubor XML můžete analyzovat, abyste shromáždili informace o živých kriketových zápasech a použili jej k vytvoření oznámení na ploše!
def loadRSS(): # url of rss feed url = 'http://www.hindustantimes.com/rss/topnews/rssfeed.xml' # creating HTTP response object from given url resp = requests.get(url) # saving the xml file with open('topnewsfeed.xml' 'wb') as f: f.write(resp.content) Here we first created a HTTP response object by sending an HTTP request to the URL of the RSS feed. The content of response now contains the XML file data which we save as topnewsfeed.xml v našem místním adresáři. Další informace o tom, jak modul požadavků funguje, naleznete v tomto článku: Požadavky GET a POST pomocí Pythonu
Zde používáme xml.etree.ElementTree (zkráceně ET) modul. Element Tree má pro tento účel dvě třídy - ElementTree představuje celý dokument XML jako strom a Živel představuje jeden uzel v tomto stromu. Interakce s celým dokumentem (čtení a zápis do/ze souborů) se obvykle provádějí na ElementTree úroveň. Interakce s jedním XML elementem a jeho dílčími elementy se provádějí na Živel úroveň. Dobře, tak si to projdeme parseXML() function now: tree = ET.parse(xmlfile)Here we create an ElementTree objekt analýzou prošlých xmlfile.
root = tree.getroot()zakořeněný() funkce vrátit kořen strom jako an Živel object.
for item in root.findall('./channel/item'): Now once you have taken a look at the structure of your XML file you will notice that we are interested only in položka živel. ./kanál/položka je ve skutečnosti XPath syntaxe (XPath je jazyk pro adresování částí dokumentu XML). Zde chceme najít všechny položka vnoučata kanál děti z vykořenit (označený '.'). Můžete si přečíst více o podporované syntaxi XPath zde . for item in root.findall('./channel/item'): # empty news dictionary news = {} # iterate child elements of item for child in item: # special checking for namespace object content:media if child.tag == '{https://video.search.yahoo.com/mrss': news['media'] = child.attrib['url'] else: news[child.tag] = child.text.encode('utf8') # append news dictionary to news items list newsitems.append(news) Now we know that we are iterating through položka prvky, kde každý položka prvek obsahuje jednu novinku. Vytvoříme tedy prázdnotu zprávy dictionary in which we will store all data available about news item. To iterate though each child element of an element we simply iterate through it like this: for child in item:Now notice a sample item element here:
We will have to handle namespace tags separately as they get expanded to their original value when parsed. So we do something like this: if child.tag == '{https://video.search.yahoo.com/mrss': news['media'] = child.attrib['url'] dítě.attrib je slovník všech atributů souvisejících s prvkem. Zde nás zajímá url atribut of média:obsah namespace tag. Now for all other children we simply do: news[child.tag] = child.text.encode('utf8') child.tag obsahuje název podřízeného prvku. dítě.text stores all the text inside that child element. So finally a sample item element is converted to a dictionary and looks like this: {'description': 'Ignis has a tough competition already from Hyun.... 'guid': 'http://www.hindustantimes.com/autos/maruti-ignis-launch.... 'link': 'http://www.hindustantimes.com/autos/maruti-ignis-launch.... 'media': 'http://www.hindustantimes.com/rf/image_size_630x354/HT/... 'pubDate': 'Thu 12 Jan 2017 12:33:04 GMT ' 'title': 'Maruti Ignis launches on Jan 13: Five cars that threa..... } Then we simply append this dict element to the list newssitems . Nakonec je tento seznam vrácen.
Jak můžete vidět, data hierarchického souboru XML byla převedena do jednoduchého souboru CSV, takže všechny zprávy jsou uloženy ve formě tabulky. To usnadňuje také rozšíření databáze. Také je možné použít data podobná JSON přímo v jejich aplikacích! Toto je nejlepší alternativa pro extrakci dat z webových stránek, které neposkytují veřejné API, ale poskytují některé kanály RSS. Všechny kódy a soubory použité ve výše uvedeném článku lze nalézt zde . co dál?