2017-01-14 6 views
0

Я должен получить все «деятельность» с этого сайта, который находится в XML: http://www.bcn.cat/tercerlloc/agenda_cultural.xmlпитон сайт синтаксического анализа XML с URLLIB

Для того, чтобы сделать это, я создал эти классы которых будут поддерживать новые виды деятельности из XML :

class GeoLoc(object): 
    def __init__(self, adresa, lat, lon): 
     self.adresa = adresa 
     self.lat = lat 
     self.lon = lon 

    def valid(self): 
     return self.lat !="" and self.lon != "" 


class Acte(GeoLoc): 
    nom = "" 
    def __init__(self, line): 
     super(Acte, self).__init__(line[0], line[1], line[2]) 
     self.nom = line[3] 

вещь я не знаю, как получить это значение, например:

<row num="9" pos="8"> 

(значение строки NUM и поз) и РБП, как получить по этому адресу

<address label="Adreça"> 
<![CDATA[Pl Glòries Catalanes 37 

Я хотел бы иметь что-то вроде этого (я использую его для различных XML):

sock = urllib.request.urlopen("http://wservice.viabicing.cat/getstations.php?v=1") 
    xmlSource = sock.read() 
    sock.close() 
    root = ET.fromstring(xmlSource) 
    estaciones = [] 
    #obtenemos las estaciones de bicing 
    for element in root.findall('station'): 
     elements = [] 
     if (element.find('streetNumber').text != None): 
      elements.append(element.find('street').text + " - " + element.find('streetNumber').text) 

ответ

0

Вам необходимо разобрать XML с параметром: strip_cdata=False для сохранения CDATA доступ к атрибутам тегов можно сделать с использованием свойства .attrib. Просмотрите lxml docs/tutorial.

parser = etree.XMLParser(strip_cdata=False) 
root = etree.XML(sock, parser) 

for element in root.findall('.//row'): 
    addr = element.find('.//address') 
    if addr is not None: 
     print element.attrib    
     print addr.text 
     print "" 
+0

Я только что сменил findall ('row') на ваш ('.//row'), и это сработало, почему это так? –

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