首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python/LXML/FindAll -无法将元素打印为字符串(python的全新功能)

Python/LXML/FindAll -无法将元素打印为字符串(python的全新功能)
EN

Stack Overflow用户
提问于 2018-10-18 04:46:39
回答 1查看 108关注 0票数 0

当我在“打印”行中使用"findall“时(我在代码中用">>>”注意到了),列表中的对象显示为XML元素。".text“函数似乎没有任何效果,不管我把它放在行中的什么地方。这些元素都是IPv4或IPv6地址-不确定这是否重要。大多数解决方案都不同于我正在做的事情,我和我的同事被难住了。这是我的第一个Python脚本。

输入样本(缩短)

代码语言:javascript
运行
复制
<rpc-reply xmlns:junos="http://xml.juniper.net/junos/18.2R1/junos">
    <isis-database-information xmlns="http://xml.juniper.net/junos/18.2R1/junos-routing" junos:style="extensive">
        <isis-database>
            <level>1</level>
            <isis-database-entry>

                -----OUTPUT OMITTED----

                <isis-prefix xmlns="http://xml.juniper.net/junos/18.2R1/junos-routing" junos:style="normal">
                    <protocol-name>IP</protocol-name>
                    <isis-topology-id>IPV4 Unicast</isis-topology-id>
Trying to print >>> <address-prefix>1.7.11.0/32</address-prefix>
                    <metric>16</metric>
                    <prefix-flag>Internal</prefix-flag>
                    <prefix-status>up</prefix-status>
                </isis-prefix>
                <isis-prefix xmlns="http://xml.juniper.net/junos/18.2R1/junos-routing" junos:style="normal">
                    <protocol-name>IP</protocol-name>
                    <isis-topology-id>IPV4 Unicast</isis-topology-id>
                    <address-prefix>1.11.12.0/24</address-prefix>
                    <metric>32</metric>
                    <prefix-flag>Internal</prefix-flag>
                    <prefix-status>up</prefix-status>
                </isis-prefix>

输出示例(缩短)

代码语言:javascript
运行
复制
##################################################
##################################################
LSP ID: D17-HYBC03.00-00
IP Address:     [<Element address-prefix at 0x7f4cdd4d0710>, <Element address-prefix at 0x7f4cdd4d0a70>]
IPv4 Node-SID:  None
IPv6 Node-SID:  None
First SRGB Label:       None
Last SRGB Label:        None
##################################################
##################################################
LSP ID: D18-HYBC04.00-00
IP Address:     [<Element address-prefix at 0x7f4cdd4d0710>, <Element address-prefix at 0x7f4cdd4d0998>]
IPv4 Node-SID:  2018
IPv6 Node-SID:  None
First SRGB Label:       16000
Last SRGB Label:        23999
##################################################
##################################################
LSP ID: D07-DSRJ01.00-00
IP Address:     [<Element address-prefix at 0x7f4cdd4d0a28>, <Element address-prefix at 0x7f4cdd4d0908>, <Element address-prefix at 0x7f4cdd4d0710>, <Element address-prefix at 0x7f4cdd4d09e0>]
IPv4 Node-SID:  7
IPv6 Node-SID:  1007
First SRGB Label:       16000
Last SRGB Label:        23999
##################################################
##################################################
LSP ID: D08-DSRJ02.00-00
IP Address:     [<Element address-prefix at 0x7f4cdd4d0998>, <Element address-prefix at 0x7f4cdd4d0878>, <Element address-prefix at 0x7f4cdd4d0908>, <Element address-prefix at 0x7f4cdd4d0638>]
IPv4 Node-SID:  8
IPv6 Node-SID:  1008
First SRGB Label:       16000
Last SRGB Label:        23999

代码

代码语言:javascript
运行
复制
from jnpr.junos import Device
from lxml import etree

####################
###etree.dump(DB)###
####################

if __name__ == '__main__':
    NODE = Device(host='x.x.x.x', user='root',  password='test').open()
    DB = NODE.rpc.get_isis_database_information(level='1', extensive = True, normalize = True, )
    DB_ROOT = DB.findall('.//isis-database/isis-database-entry')

    for DB_ENTRY in DB_ROOT:

        LSPID = 'lsp-id'
        PREFIX = 'isis-prefix'
        PREFIX_ADDRESS = 'address-prefix'
        SID_V4 = 'isis-node-segment/isis-node-segment-ipv4-index'
        SID_V6 = 'isis-node-segment/isis-node-segment-ipv6-index'
        LABEL_FIRST = 'isis-node-segment/isis-node-segment-block/isis-node-segment-block-first-label'
        LABEL_LAST = 'isis-node-segment/isis-node-segment-block/isis-node-segment-block-last-label'

        print('#' * 50) 
        print('#' * 50)
        print("LSP ID:\t{LSPID}".format(LSPID=DB_ENTRY.findtext(LSPID)))
    >>> print("IP Address:\t{PREFIX_ADDRESS}".format(PREFIX_ADDRESS=DB_ENTRY.findall("isis-prefix/[metric='0']address-prefix")))    
        print("IPv4 Node-SID:\t{SID_V4}".format(SID_V4=DB_ENTRY.findtext(SID_V4)))  
        print("IPv6 Node-SID:\t{SID_V6}".format(SID_V6=DB_ENTRY.findtext(SID_V6)))      
        print("First SRGB Label:\t{LABEL_FIRST}".format(LABEL_FIRST=DB_ENTRY.findtext(LABEL_FIRST)))        
        print("Last SRGB Label:\t{LABEL_LAST}".format(LABEL_LAST=DB_ENTRY.findtext(LABEL_LAST)))
EN

回答 1

Stack Overflow用户

发布于 2018-10-18 06:19:20

如果DB_ENTRY<isis-database-entry>节点,那么DB_ENTRY.findall("isis-prefix/address-prefix")将会找到所有(2)个<address-prefix>标签的列表。

是的,这就是输出示例中显示的内容:IP Address: [<Element address-prefix at 0x7f4cdd4d0710>,...]

看起来你真的想要两个循环,就像这样:

代码语言:javascript
运行
复制
for DB_ENTRY in list(DB_ROOT):
    for ISIS_PREFIX in DB_ENTRY:
        print("IP Address:\t{PREFIX_ADDRESS}".format(PREFIX_ADDRESS=ISIS_PREFIX.findall("address-prefix")[0].text))

它已更改为ISIS_PREFIX.findall(),而不是DB_ENTRY.findall()。该.findall()返回一个1的列表,因此我在末尾添加了[0]以从列表中获取IP地址节点,然后添加.text以返回实际的IP地址而不是XML节点信息。

我的测试显示了以下输出:

代码语言:javascript
运行
复制
IP Address: 1.7.11.0/32
IP Address: 1.11.12.0/24
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52863357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档