【问题标题】:python parse xml website with urllibpython 使用 urllib 解析 xml 网站
【发布时间】:2017-05-29 17:19:33
【问题描述】:

我必须从该网站获取所有 XML 格式的“活动”: http://www.bcn.cat/tercerlloc/agenda_cultural.xml

为了做到这一点,我创建了这些类,它们将保留 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 和 pos 行的值)以及如何到达该地址

<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)

【问题讨论】:

    标签: python xml xml-parsing html-parsing


    【解决方案1】:

    您需要使用参数解析 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 ""
    

    【讨论】:

    • 我刚刚将 findall('row') 更改为您的 ('.//row') 并且有效,这是为什么呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 2015-11-30
    • 2014-09-03
    • 2012-02-12
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多