【问题标题】:How to get path of an element in lxml?如何获取lxml中元素的路径?
【发布时间】:2009-10-16 10:24:06
【问题描述】:

我正在使用 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 xpath lxml


    【解决方案1】:

    使用来自 ElementTree 对象的getpath

    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]
    

    【讨论】:

    • 我觉得应该是for e in tree.iter():,即tree.iter.
    • @Jabba 你为什么这么认为?你试过我提供的代码吗?它似乎工作,不是吗?你有理由不这么认为吗?
    • 它可能在你最初写这个的时候并不存在,并不重要,但你也可以通过tree = root.getroottree() 来获取一个 ElementTree 对象。
    • 为了完成,当我使用https://requests-html.kennethreitz.org/ 拉网页时,我执行以下操作:webpage = session.get('URL HERE') 然后root = etree.HTML(webpage.text) 然后tree = etree.ElementTree(root) 然后简单的 for 循环如所述在答案中。
    【解决方案2】:

    查看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】:

      如果您的代码部分中只有元素,并且您希望元素的 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)
      

      【讨论】:

        【解决方案4】:
        root = etree.parse(open('tmp.txt'))
        
        for e in root.iter():
            print root.getpath(e)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-29
          • 1970-01-01
          • 2012-08-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多