XML-elemzés Pythonban

XML-elemzés Pythonban
Ez a cikk arra összpontosít, hogyan lehet egy adott XML-fájlt elemezni, és strukturált módon kinyerni belőle néhány hasznos adatot. XML: Az XML az eXtensible Markup Language rövidítése. Adatok tárolására és szállítására tervezték. Úgy tervezték, hogy ember és gép által is olvasható legyen. Ezért az XML tervezési céljai az egyszerűség általánosságára és az interneten való használhatóságra helyezik a hangsúlyt. Az oktatóanyagban elemezni kívánt XML-fájl valójában egy RSS-hírcsatorna. RSS: Az RSS (Rich Site Summary – gyakran nevezik Really Simple Syndication) szabványos webes hírcsatorna-formátumok családját használja a gyakran frissített információk, például a blogbejegyzések, a hírek címsorai és a hangvideó közzétételére. Az RSS XML formátumú egyszerű szöveg.
  • Maga az RSS formátum viszonylag könnyen olvasható mind az automatizált folyamatok, mind az emberek által.
  • Az ebben az oktatóanyagban feldolgozott RSS egy népszerű hírwebhely legnépszerűbb híreinek RSS feedje. Meg tudod nézni itt . Célunk, hogy ezt az RSS-hírcsatornát (vagy XML-fájlt) feldolgozzuk, és más formátumban elmentsük későbbi használatra.
Használt Python modul: Ez a cikk a beépített használatára összpontosít xml python modul az XML elemzéséhez, és a fő hangsúly a ElementTree XML API ennek a modulnak. Végrehajtás: Python
   #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:
  • Töltse be az RSS-hírcsatornát a megadott URL-ről, és mentse el XML-fájlként.
  • Elemezze az XML-fájlt, hogy a híreket szótárlistaként mentse, ahol minden szótár egyetlen hírelemet tartalmaz.
  • Mentse el a híreket CSV-fájlba.
Próbáljuk meg részletekben értelmezni a kódot:
    RSS feed betöltése és mentése
    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 a helyi címtárunkban. Ha többet szeretne megtudni a kérelmek modul működéséről, kövesse ezt a cikket: GET és POST kérések Python használatával XML elemzése teremtettünk parseXML() függvény az XML fájl elemzéséhez. Tudjuk, hogy az XML eredendően hierarchikus adatformátum, és ennek legtermészetesebb módja a fa. Nézze meg például az alábbi képet: XML elemzése Itt használjuk xml.etree.ElementTree (nevezzük röviden ET) modult. Az Element Tree-nek két osztálya van erre a célra - ElementTree az egész XML dokumentumot faként ábrázolja és Elem egyetlen csomópontot képvisel ebben a fában. A teljes dokumentummal való interakciók (fájlokba/fájlokba való írás és olvasás) általában a ElementTree szint. Az egyetlen XML-elemmel és annak alelemeivel való interakciókat a Elem szint. Rendben, akkor menjünk végig a parseXML() function now:
    tree = ET.parse(xmlfile) 
    Here we create an ElementTree objektumot az átadott elem elemzésével xmlfile.
    root = tree.getroot() 
    meggyökerezett() függvény visszaadja a gyökerét fa mint egy Elem 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 tétel elem. ./csatorna/elem valójában XPath szintaxis (az XPath egy XML-dokumentum részeinek címezésére szolgáló nyelv). Itt mindent meg akarunk találni tétel unokái csatorna gyermekei a gyökér (jellel '.') elem. További információ a támogatott XPath szintaxisról itt .
    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 tétel elemek, ahol mindegyik tétel elem egy hírt tartalmaz. Tehát üreset hozunk létre hír 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: XML-elemzés Pythonban 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'] 
    gyermek.attrib az egy elemhez kapcsolódó összes attribútum szótára. Itt vagyunk kíváncsiak url attribútuma média:tartalom namespace tag. Now for all other children we simply do:
    news[child.tag] = child.text.encode('utf8') 
    gyermek.tag tartalmazza a gyermek elem nevét. gyermek.szöveg 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 híroldalak . Végül ez a lista visszakerült. Adatok mentése CSV-fájlba Most egyszerűen elmentjük a hírek listáját egy CSV-fájlba, hogy a későbbiekben könnyen felhasználható vagy módosítható legyen mentés CSV-be() funkció. Ha többet szeretne megtudni a szótárelemek CSV-fájlba írásáról, olvassa el ezt a cikket: CSV-fájlok használata Pythonban
Tehát most így néznek ki formázott adataink: eredmény Amint láthatja, a hierarchikus XML-fájl adatait egyszerű CSV-fájllá alakították át, így az összes hírt táblázat formájában tárolják. Ez megkönnyíti az adatbázis bővítését is. A JSON-szerű adatokat közvetlenül is használhatják alkalmazásaikban! Ez a legjobb alternatíva adatok kinyerésére olyan webhelyekről, amelyek nem biztosítanak nyilvános API-t, de biztosítanak néhány RSS-hírcsatornát. A fenti cikkben használt összes kód és fájl megtalálható itt . Mi lesz ezután?
  • A fenti példában használt híroldal további rss feedjeit tekintheti meg. Megpróbálhatja létrehozni a fenti példa kiterjesztett változatát más RSS-hírcsatornák elemzésével.
  • Ön krikett rajongó? Majd ez Az rss feednek érdekelnie kell! Elemezheti ezt az XML-fájlt, hogy információkat kaparjon le az élő krikettmérkőzésekről, és készítsen asztali értesítőt!
HTML és XML kvíz Kvíz létrehozása