XML analizavimas Python
Šiame straipsnyje daugiausia dėmesio skiriama tam, kaip galima išanalizuoti nurodytą XML failą ir struktūriškai iš jo išgauti naudingų duomenų. XML: XML reiškia eXtensible Markup Language. Jis buvo skirtas duomenims saugoti ir transportuoti. Jis buvo sukurtas taip, kad būtų skaitomas ir žmogaus, ir mašinų. Štai kodėl XML projektavimo tikslai pabrėžia paprastumo bendrumą ir patogumą naudoti visame internete. XML failas, kurį reikia analizuoti šioje pamokoje, iš tikrųjų yra RSS kanalas. RSS: RSS (Rich Site Summary, dažnai vadinama Really Simple Syndication) naudoja standartinių žiniatinklio sklaidos kanalų formatų šeimą, kad skelbtų dažnai atnaujinamą informaciją, pvz., tinklaraščio įrašus, naujienų antraštes, garso ir vaizdo įrašus. RSS yra XML formatuotas paprastas tekstas.
- Patį RSS formatą gana lengva perskaityti ir automatizuotiems procesams, ir žmonėms.
- Šioje mokymo programoje apdorotas RSS yra populiariausių naujienų iš populiarios naujienų svetainės RSS kanalas. Galite tai patikrinti čia . Mūsų tikslas yra apdoroti šį RSS kanalą (arba XML failą) ir išsaugoti jį kitu formatu, kad galėtumėte naudoti ateityje.
#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: - Įkelkite RSS tiekimą iš nurodyto URL ir išsaugokite jį kaip XML failą.
- Išanalizuokite XML failą, kad išsaugotumėte naujienas kaip žodynų sąrašą, kur kiekvienas žodynas yra vienas naujienų elementas.
- Išsaugokite naujienas į CSV failą.
- Galite pažvelgti į daugiau naujienų svetainės RSS kanalų, naudojamų aukščiau esančiame pavyzdyje. Galite pabandyti sukurti išplėstinę anksčiau pateikto pavyzdžio versiją, analizuodami ir kitus RSS kanalus.
- Ar esate kriketo gerbėjas? Tada tai RSS kanalas turi sudominti jus! Galite išanalizuoti šį XML failą, kad gautumėte informaciją apie tiesiogines kriketo rungtynes ir sukurtumėte darbalaukio pranešimo priemonę!
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 mūsų vietiniame kataloge. Norėdami gauti daugiau informacijos apie tai, kaip veikia užklausų modulis, skaitykite šį straipsnį: GAUTI ir POST užklausas naudodami Python
Čia mes naudojame xml.etree.ElementTree (trumpai vadinkite ET) modulį. Element Tree šiam tikslui turi dvi klases - Elementų medis vaizduoja visą XML dokumentą kaip medį ir Elementas reiškia vieną šio medžio mazgą. Sąveika su visu dokumentu (skaitoma ir rašoma į failus ir iš jų) paprastai atliekama naudojant Elementų medis lygiu. Sąveika su vienu XML elementu ir jo subelementais atliekama Elementas lygiu. Gerai, eikime per parseXML() function now: tree = ET.parse(xmlfile)Here we create an Elementų medis objektą analizuodami priimtą xml failą.
root = tree.getroot()įsišaknijęs () funkcija grąžina šaknį medis kaip an Elementas 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 daiktas elementas. ./channel/item iš tikrųjų yra XPath sintaksė (XPath yra kalba, skirta XML dokumento dalims adresuoti). Čia mes norime rasti viską daiktas anūkai kanalas vaikai iš šaknis (žymimas „.“) elementas. Galite perskaityti daugiau apie palaikomą XPath sintaksę čia . 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 daiktas elementai, kur kiekvienas daiktas elemente yra viena naujiena. Taigi sukuriame tuščią naujienos 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'] vaikas.attrib yra visų su elementu susijusių atributų žodynas. Čia mus domina url atributas media:turinys namespace tag. Now for all other children we simply do: news[child.tag] = child.text.encode('utf8') vaikas.žyma yra antrinio elemento pavadinimas. vaikas.tekstas 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 naujienų svetainės . Galiausiai šis sąrašas grąžinamas.
Kaip matote, hierarchinio XML failo duomenys buvo konvertuoti į paprastą CSV failą, kad visos naujienos būtų saugomos lentelės pavidalu. Taip pat lengviau išplėsti duomenų bazę. Taip pat galite naudoti JSON tipo duomenis tiesiogiai savo programose! Tai geriausia alternatyva duomenims išgauti iš svetainių, kurios neteikia viešosios API, bet pateikia kai kuriuos RSS kanalus. Galima rasti visą aukščiau esančiame straipsnyje naudojamą kodą ir failus čia . Kas toliau? Jums Gali Patikti
Top Straipsniai
Kategorija
Įdomios Straipsniai