代码之家  ›  专栏  ›  技术社区  ›  Fluffy

如何获取lxml中元素的路径?

  •  26
  • Fluffy  · 技术社区  · 15 年前

    我正在使用Python中LXML的xpath在HTML文档中搜索。如何获得某个元素的路径?下面是Ruby Nokogiri的例子:

    page.xpath('//text()').each do |textnode|
        path = textnode.path
        puts path
    end
    

    例如“打印” /HTML/BODY/DIV/DIV[1]/DIV[1]/P/TEXT()[1] 这是我想在python中得到的字符串。

    4 回复  |  直到 8 年前
        1
  •  47
  •   nosklo    15 年前

    使用 getpath 从elementtree对象。

    from lxml import etree
    
    root = etree.fromstring('<foo><bar>Data</bar><bar><baz>data</baz>'
                            '<baz>data</baz></bar></foo>')
    
    tree = etree.ElementTree(root)
    for e in root.iter():
        print tree.getpath(e)
    

    印刷品

    /foo
    /foo/bar[1]
    /foo/bar[2]
    /foo/bar[2]/baz[1]
    /foo/bar[2]/baz[2]
    
        2
  •  18
  •   mmmmmm    10 年前

    Xpath and XSLT with lxml from the lxml documentation 这将给出包含文本的元素的路径

    一个例子是

    import cStringIO
    from lxml import etree
    
    f = cStringIO.StringIO('<foo><bar><x1>hello</x1><x1>world</x1></bar></foo>')
    tree = lxml.etree.parse(f)
    find_text = etree.XPath("//text()")
    
    # and print out the required data
    print [tree.getpath( text.getparent()) for text in find_text(tree)]
    
    # answer I get is 
    >>> ['/foo/bar/x1[1]', '/foo/bar/x1[2]']
    
        3
  •  4
  •   hostingutilities.com    12 年前
    root = etree.parse(open('tmp.txt'))
    
    for e in root.iter():
        print root.getpath(e)
    
        4
  •  4
  •   shrewmouse    8 年前

    如果代码部分中的所有内容都是元素,并且您希望元素的xpath执行此操作,那么 element.getroottree().getpath(element) 会完成任务的。

    from lxml import etree
    
    xml = '''
    <test>
        <a/>
        <b>
           <i/>
           <ii/>
        </b>
    </test>
    '''
    tree = etree.fromstring(xml)
    
    for element in tree.iter():
        print element.getroottree().getpath(element)