zoukankan      html  css  js  c++  java
  • lxml基础

    节点操作:

    from lxml import etree
    
    # 1.创建Element对象,参数即节点名称
    root = etree.Element('root')
    print(root)   # <Element root at 0x1551e08>
    
    # 2.获取节点名称,tag
    print(root.tag)   # root
    
    # 3.输出XML内容,tostring,参数为Element对象
    print(etree.tostring(root))   # b'<root/>'
    
    # 4.添加子节点,SubElement,第一个参数为父节点(Element对象),第二个参数为子节点名称
    child1 = etree.SubElement(root, 'child1')
    child2 = etree.SubElement(root, 'child2')
    child3 = etree.SubElement(root, 'child3')
    print(etree.tostring(root))   #b'<root><child1/><child2/><child3/></root>'
    
    # 5.删除子节点,remove删除指定节点,参数为Element对象。clear清空所有节点。
    # root.remove(child1)  # 删除指定子节点
    # print(etree.tostring(root))
    # root.clear()  # 清除所有子节点
    # print(etree.tostring(root))   # b'<root/>'
    
    # 6.以列表的方式操作子节点
    # 下标访问
    child = root[0]
    print(child.tag)   #child1
    
    # 子节点数量
    print(len(root))  # 3
    
    # 获取索引号
    print(root.index(child2))   #1
    
    # 遍历
    for child in root:
        print(child.tag)
    # child1
    # child2
    # child3
    
    # 插入
    root.insert(0, etree.Element('child0'))
    print(etree.tostring(root))   #b'<root><child0/><child1/><child2/><child3/></root>'
    
    # 切片,切出来的还是列表
    start = root[:1]
    end = root[-1:]
    print(start[0].tag, end[0].tag)   # child0 child3
    
    # 尾部添加
    root.append( etree.Element('child4') )
    print(etree.tostring(root))   # b'<root><child0/><child1/><child2/><child3/><child4/></root>'
    
    # 7.获取父节点
    print(child1.getparent())       # <Element root at 0x14e1e08>
    print(child1.getparent().tag)   # root

    属性操作:

    # 属性是以key-value的方式存储的,就像字典一样。
    
    # 1.创建属性
    # 可以在创建Element对象时同步创建属性,第二个参数即为属性名和属性值:
    root = etree.Element('root', interesting='totally')
    print(etree.tostring(root))   # b'<root interesting="totally"/>'
    # 也可以使用set方法给已有的Element对象添加属性,两个参数分别为属性名和属性值:
    root.set('hello', 'Huhu')
    print(etree.tostring(root))   # b'<root interesting="totally" hello="Huhu"/>'
    
    # 2.获取属性
    # 属性是以key-value的方式存储的,就像字典一样。
    # get,获得某一个属性值
    print(root.get('interesting'))    # totally
    
    # keys,获取所有的属性名
    print(sorted(root.keys()))    # ['hello', 'interesting']
    
    # items,获取所有的键值对
    # for name, value in root.items():
    #     print('%s = %r' % (name, value))
    for name, value in sorted(root.items()):    # sorted还可以排序
        print('%s = %r' % (name, value))
    # interesting = 'totally'
    # hello = 'Huhu'
    
    # 也可以用attrib属性一次拿到所有的属性及属性值存于字典中:
    
    attributes = root.attrib
    print(attributes)    # {'hello': 'Huhu', 'interesting': 'totally'}
    
    attributes['good'] = 'Bye'  # 字典的修改影响节点
    print(root.get('good'))     # Bye

    文本操作:

    # 1.text和tail属性
    # 一般情况,可以用Element的text属性访问标签的文本。
    root = etree.Element('root')
    root.text = 'Hello, World!'
    print(root.text)    # Hello, World!
    print(etree.tostring(root))   # b'<root>Hello, World!</root>'
    
    # XML的标签一般是成对出现的,有开有关,但像HTML则可能出现单一的标签,比如下面这段代码中的<br/>。
    # <html><body>Text<br/>Tail</body></html>
    
    # Element类提供了tail属性支持单一标签的文本获取。
    html = etree.Element('html')
    body = etree.SubElement(html, 'body')
    body.text = 'Text'
    print(etree.tostring(html))   # b'<html><body>Text</body></html>'
    
    br = etree.SubElement(body, 'br')
    print(etree.tostring(html))   # b'<html><body>Text<br/></body></html>'
    
    # tail仅在该标签后面追加文本
    br.tail = 'Tail'
    print(etree.tostring(br))         # b'<br/>Tail'
    print(etree.tostring(html))   # b'<html><body>Text<br/>Tail</body></html>'
    
    # tostring方法增加method参数,过滤单一标签,输出全部文本
    print(etree.tostring(html, method='text'))   # b'TextTail'
    
    # 2.XPath方式
    # 方式一:过滤单一标签,返回文本
    print(html.xpath('string()'))   # TextTail
    # 方式二:返回列表,以单一标签为分隔
    print(html.xpath('//text()'))   # ['Text', 'Tail']
    
    # 方法二获得的列表,每个元素都会带上它所属节点及文本类型信息,如下:
    texts = html.xpath('//text()')
    
    print(texts[0])     # Text
    # 所属节点
    parent = texts[0].getparent()
    print(parent.tag)   # body
    
    print(texts[1], texts[1].getparent().tag)    # Tail br
    
    # 文本类型:是普通文本还是tail文本
    print(texts[0].is_text)   # True
    print(texts[1].is_text)   # False
    print(texts[1].is_tail)   # True
    
  • 相关阅读:
    Go -- 调用C/C++
    fatal error: sys/cdefs.h: No such file or directory
    ubuntu下安装go语言;sublime+gocode搭建;go的卸载和环境变量配个人.bashrc
    sqlite多表关联update
    sqlite insert select 联合使用
    sqlite3 支持的关联查询
    iOS -- 拨打电话
    lapis 项目添加prometheus 监控
    lapis 1.7.0 更好的openresty 版本兼容以及安全数据库支持
    skipper backend 负载均衡配置
  • 原文地址:https://www.cnblogs.com/yangxiaoling/p/6859283.html
Copyright © 2011-2022 走看看