簡體   English   中英

控制搜索深度findall Lxml

[英]Control search depth findall Lxml

我是Python的初學者,並嘗試使用python中的LXML解析XML。 我正在嘗試使用finall()搜索標簽,但希望控制深度,在這里我可以搜索標簽,但搜索范圍不超過一個層次。 解釋如下:

<?xml version='1.0' encoding='utf-8'?>
<system xmlns="some_name_space">
<a>
    <host>Random Name</host>
    <class>
        <name>Main_Tag_1</name>
        <detail>
            <name>Child_Tag_1</name>
            <ip>ip_1</ip>
            <port>port_1</port>
        <detail>
    </class>
    <class>
        <name>Main_Tag_2</name>
        <detail>
            <name>Child_Tag_2</name>
            <ip>ip_2</ip>
            <port>port_2</port>
        <detail>
    </class>
    <class>
        <name>Main_Tag_3</name>
        <detail>
            <name>Child_Tag_3</name>
            <ip>ip_3</ip>
            <port>port_3</port>
        <detail>
    </class>
</a>

我使用下面的Python找到所有Main_tags共享相同的標簽名稱為名稱 我還沒有在這里添加完整的程序。 但是此函數是類的一部分。

def name_ip_dict(self,filename):
self.tag_replace = {}
context = ET.iterparse(filename, tag='{some_name_space}class')
for action,elem in context:
    name_tag = elem.findall(".//{some_name_space}name")
    for name in name_tag: 
        print name.text
        for node in elem:
            ip_list = node.findall(".//{some_name_space}ip") 
            for ip in ip_node_list:
                self.tag_replace.setdefault(name.text, []).append(ip.text)

現在,我得到的輸出為

{'Main_Tag_1': ['ip_1'], 'Child_tag_1': ['ip_1'], 'Main_Tag_2': ['ip_2'], 'Child_tag_1': ['ip_2']} and so on..

但是我只想獲取First Parent,即Main_Tag1,2或3,以及ip標簽中的文本。

{'Main_Tag_1': ['ip_1'], 'Main_Tag_2': ['ip_2']} and so on..

這使我感到有必要控制findall的深度,但是我無法找到與Web深度有關的任何內容。

請讓我知道是否已經存在此類用例,以及實現此用例的最佳方法是什么。

如果只想搜索直接子元素(不包括孫子元素和更深的后代元素),請使用單斜杠( / ):

name_tag = elem.findall("./{some_name_space}name")

請注意,當您需要支持更高級的XPath表達式時,請使用lxmlxpath()方法而不是findall() 后者僅支持非常有限的XPath表達式集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM