zoukankan      html  css  js  c++  java
  • Python之lxml库学习笔记二

    使用XPath查找文本

    另一个抽取XML树的文本内容是XPath,
    >>> print(html.xpath("string()")) # lxml.etree only!
    TEXTTAIL
    >>> print(html.xpath("//text()")) # lxml.etree only!
    [’TEXT’, ’TAIL’]

    如果经常使用,可以包装成一个方法:

    >>> build_text_list = etree.XPath("//text()") # lxml.etree only!
    >>> print(build_text_list(html))
    [’TEXT’, ’TAIL’]

    也可以通过getparent方法得到父节点

    >>> texts = build_text_list(html)
    >>> print(texts[0])
    TEXT
    >>> parent = texts[0].getparent()
    >>> print(parent.tag)
    body
    >>> print(texts[1])
    TAIL
    >>> print(texts[1].getparent().tag)
    br
    You can also find out if it’s normal text content or tail text:
    >>> print(texts[0].is_text)
    True
    >>> print(texts[1].is_text)
    False
    >>> print(texts[1].is_tail)
    True

     

    树的迭代:

    Elements提供一个树的迭代器可以迭代访问树的元素。

    >>> root = etree.Element("root")
    >>> etree.SubElement(root, "child").text = "Child 1"
    >>> etree.SubElement(root, "child").text = "Child 2"
    >>> etree.SubElement(root, "another").text = "Child 3"
    >>> print(etree.tostring(root, pretty_print=True))
    <root>
    <child>Child 1</child>
    <child>Child 2</child>
    <another>Child 3</another>
    </root>

    >>> for element in root.iter():
    ... print("%s - %s" % (element.tag, element.text))
    root – None
    child - Child 1
    child - Child 2
    another - Child 3

    如果知道感兴趣的tag,可以把tag的名字传给iter方法,起到过滤作用。

    >>> for element in root.iter("child"):
    ... print("%s - %s" % (element.tag, element.text))
    child - Child 1
    child - Child 2

    默认情况下,迭代器得到一个树的所有节点,包括ProcessingInstructions, Comments and Entity的实例。如果想确认只有Elements对象返回,可以把Element factory作为参数传入。

    >>> root.append(etree.Entity("#234"))
    >>> root.append(etree.Comment("some comment"))
    >>> for element in root.iter():
    ... if isinstance(element.tag, basestring):
    ... print("%s - %s" % (element.tag, element.text))
    ... else:
    ... print("SPECIAL: %s - %s" % (element, element.text))
    root - None
    child - Child 1
    child - Child 2
    another - Child 3
    SPECIAL: ê - ê
    SPECIAL: <!--some comment--> - some comment


    >>> for element in root.iter(tag=etree.Element):
    ... print("%s - %s" % (element.tag, element.text))
    root - None
    child - Child 1
    child - Child 2
    another - Child 3
    >>> for element in root.iter(tag=etree.Entity):
    ... print(element.text)
    ê

    作者:Shane
    出处:http://bluescorpio.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    把eclipse 3.4的插件移动到独立目录中
    Crest大家都来山寨一个GObject吧
    c# 扩展方法奇思妙用性能篇一:扩展方法性能初测
    [幽默]今天看了几页c语言入门,想写个ERP, 帮我看看 技术上还差些什么?
    c# 扩展方法奇思妙用高级篇一:改进 Scottgu 的 "In" 扩展
    [个人]我的积分与排名日志
    反驳 老赵 之 “伪”递归
    c# 扩展方法奇思妙用变态篇一:由 Fibonacci 数列引出 “委托扩展” 及 “递推递归委托”
    c# 扩展方法奇思妙用高级篇五:ToString(string format) 扩展
    瑞士军刀 VS 单一职责原则
  • 原文地址:https://www.cnblogs.com/bluescorpio/p/1748527.html
Copyright © 2011-2022 走看看