2013-07-03 2 views
0

Этот XML-документ содержит набор тегов events-data. Я хочу извлечь информацию из самого ПОСЛЕДНИЕ events-data. Например, в приведенном ниже коде я хочу перейти к тегу events-data, спуститься до тега event-date и извлечь текст дочернего тега date. На данный момент я использую BeautifulSoup в Python для перемещения по этому документу. Есть идеи?BeautifulSoup XML Python, извлекающий атрибуты из определенных тегов

<?xml version="1.0" encoding="UTF-8"?> 
     <first-tag> 
      <second-tag> 
      <events-data> 
       <event-date> 
        <date>20040913</date> 
       </event-date> 
      </events-data> 

      <events-data> #the one i want to traverse to grab date text 
      <event-date> 
       <date>20040913</date> 
      </event-date> 
      </events-data> 
     </second-tag> 
     </first-tag> 
+0

Я думал, как в 'elementtree' или' minidom', где вы можете пройти теги на основе индекса и длины, но я не могу думать о синтаксисе (или найти что-то в этом отношении), которое будет работать для BeautifulSoup. Имейте в виду, что я все еще новичок в beautifulsoup. – sdweldon

+0

Как-то он должен подсчитывать количество событий 'events-data', возможно,' numEvents = len (soup.find ('events-data')) ', а затем читать дочерние теги по этому индексу? – sdweldon

ответ

1

Это использование BeautifulSoup 3

import os 
import sys 

# Import Custom libraries 
from BeautifulSoup import BeautifulStoneSoup 

xml_str = \ 
''' 
<?xml version="1.0" encoding="UTF-8"?> 
    <first-tag> 
     <second-tag> 
     <events-data> 
      <event-date> 
       <date>20040913</date> 
      </event-date> 
     </events-data> 

     <events-data> 
     <event-date> 
      <date>20040913</date> 
     </event-date> 
     </events-data> 
    </second-tag> 
    </first-tag> 
''' 
soup = BeautifulStoneSoup(xml_str) 

event_data_location = lambda x: x.name == "events-data" 

events = soup.findAll(event_data_location) 
if(events): 
    # The last event-data 
    print events[-1].text 
+0

Это работало безупречно, спасибо! Но еще один запрос, скажем, было больше тегов в 'event-date', как бы их схватить? я чувствую, что это что-то вроде строк 'print events [-1] .text (.. другой тег ..)' – sdweldon

+0

О, никогда не буду использовать это для каждого дочернего тега. +1 отличная быстрая работа благодаря бутону! – sdweldon

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