- RSS-formatet i sig är relativt lätt att läsa både av automatiserade processer och av människor.
- Den RSS som behandlas i den här handledningen är RSS-flödet med de bästa nyheterna från en populär nyhetswebbplats. Du kan kolla upp det här . Vårt mål är att bearbeta detta RSS-flöde (eller XML-fil) och spara det i något annat format för framtida bruk.
#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: - Ladda RSS-flöde från angiven URL och spara det som en XML-fil.
- Analysera XML-filen för att spara nyheter som en lista över ordböcker där varje ordbok är en enda nyhet.
- Spara nyheterna i en CSV-fil.
- Du kan ta en titt på fler rss-flöden på nyhetswebbplatsen som används i exemplet ovan. Du kan försöka skapa en utökad version av exemplet ovan genom att analysera andra rss-flöden också.
- Är du ett cricketfan? Sedan detta rss-flöde måste vara av ditt intresse! Du kan analysera den här XML-filen för att skrapa information om live-cricket-matcherna och använda för att göra en skrivbordsavisering!
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 i vår lokala katalog. Följ den här artikeln för mer insikt om hur modulen förfrågningar fungerar: GET och POST-förfrågningar med Python
Här använder vi xml.etree.ElementTree (kalla det kort och gott ET) modul. Element Tree har två klasser för detta ändamål - ElementTree representerar hela XML-dokumentet som ett träd och Element representerar en enda nod i detta träd. Interaktioner med hela dokumentet (läsning och skrivning till/från filer) görs vanligtvis på ElementTree nivå. Interaktioner med ett enda XML-element och dess underelement görs på Element nivå. Ok så låt oss gå igenom parseXML() function now: tree = ET.parse(xmlfile)Here we create an ElementTree objekt genom att analysera det godkända xml-fil.
root = tree.getroot()getrooted() funktion returnerar roten till träd som en Element 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 punkt element. ./kanal/objekt är faktiskt XPath syntax (XPath är ett språk för att adressera delar av ett XML-dokument). Här vill vi hitta alla punkt barnbarn till kanal barn till rot (betecknas med '.') element. Du kan läsa mer om XPath-syntax som stöds här . 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 punkt element där varje punkt element innehåller en nyhet. Så vi skapar en tom nyheter 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'] barn.attrib är en ordbok över alla attribut som är relaterade till ett element. Här är vi intresserade av url attribut av media:innehåll namespace tag. Now for all other children we simply do: news[child.tag] = child.text.encode('utf8') child.tag innehåller namnet på det underordnade elementet. barn.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 nyhetssidor . Äntligen är denna lista tillbaka.
Som du kan se har de hierarkiska XML-fildata konverterats till en enkel CSV-fil så att alla nyheter lagras i form av en tabell. Detta gör det lättare att utöka databasen också. Man kan också använda JSON-liknande data direkt i sina applikationer! Detta är det bästa alternativet för att extrahera data från webbplatser som inte tillhandahåller ett offentligt API men som tillhandahåller vissa RSS-flöden. All kod och filer som används i ovanstående artikel kan hittas här . Vad härnäst?