lxml的使用简要

1.安装

pip install lxml

在Linux CentOS-6.10下可以这样安装:

yum install python-lxml

2.简单导入

import xml.etree.ElementTree as etree  # Python 2.7.16

3._ElementInterface类

http://effbot.org/zone/pythondoc-elementtree-ElementTree.htm#elementtree.ElementTree._ElementInterface-class

_ElementInterface(tag, attrib):内部元素类,用于定义元素接口。不能直接创建此类的实例,要用Element类和SubElement类代替。
参数:
tag:元素名称。
attrib:元素的属性字典。

方法与属性:
__delitem__(index):删除给定的子元素。
__delslice__(start, stop):删除从start到stop的子元素,不包含stop。
__getitem__(index):返回给定的子元素。
__getslice__(start, stop):返回从start到stop的子元素列表,不包含stop。
__len__():子元素个数。
__setitem__(index, element):设置子元素。
__setslice__(start, stop, elements):设置从start到stop的子元素,不包含stop。
append(element):在元素末尾添加一个子元素。
clear():清除元素,包括把所有的子元素、属性、tail、text都删除或设置为None。
find(path):传入名称或路径,返回找到的第一个子元素,没有找到就返回None。
findall(path):传入名称或路径,返回找到的所有子元素的列表。
findtext(path, default=None):传入名称或路径,返回找到的第一个子元素的字符串,没有找到就返回default给定的值。
get(key, default=None):获取属性值,如果不存在,返回default值。
getchildren():返回所有子元素列表。
getiterator(tag=None):返回列表或迭代器,包含了tag指定的元素及其所有子元素,按文档的顺序。如果文档在迭代过程中被修改了,结果是未定义的。
insert(index, element):在指定位置插入元素。
items():返回属性的元组,(string, string)。
keys():所有属性名列表。
makeelement(tag, attrib):创建一个新的元素,与当前元素有相同的类型。
remove(element):删除子元素,此子元素是通过对比id来匹配。
set(key, value):设置元素属性。
attrib:属性字典,如果可以的话,用get,set,keys,items来访问属性。
tail:在标签结束后,下一个兄弟元素之前的字符串。
text:第一个子元素前的字符串。

4.Element工厂

http://effbot.org/zone/pythondoc-elementtree-ElementTree.htm#elementtree.ElementTree.Element-function

Element(tag, attrib={}, **extra):返回一个元素对象。
参数:
tag:元素名
attrib:属性字典
extra:额外的属性

元素的方法与属性参考_ElementInterface类。

5.ElementTree类

http://effbot.org/zone/pythondoc-elementtree-ElementTree.htm#elementtree.ElementTree.ElementTree-class

ElementTree(element=None, file=None):用于包装文档为文档树。
参数:
element:根元素。
file:文件名或文件对象,文件的内容用于初始化文档树。

方法和属性:
_setroot(element):设置根元素。
find(path):传入名称或路径,返回找到的第一个顶层元素,没有找到就返回None。类似于getroot().find(path)。
findall(path):传入名称或路径,返回找到的所有顶层元素的列表。类似于getroot().findall(path)。
findtext(path, default=None):传入名称或路径,返回找到的第一个顶层元素的字符串,没有找到就返回default给定的值。类似于getroot().findtext(path)。
getiterator(tag=None):根元素的迭代器,迭代整个文档树。
getroot():获取根元素。
parse(source, parser=None):导入XML文件。
write(file, encoding=”us-ascii”):保存文档树为XML文件。

6.SubElement工厂

SubElement(parent, tag, attrib={}, **extra):创建子元素。
参数:
parent:父元素
tag:元素名
attrib:属性字典
extra:额外的属性

元素的方法与属性参考_ElementInterface类。

7.一些函数

dump(elem):输出到sys.stdout。用于debug。
fromstring(text):解析XML的字符串,返回元素对象。
iselement(element):是否为元素。
parse(source, parser=None):解析XML文档为文档树。
tostring(element, encoding=None):返回元素的XML字符串。
XML(text):同fromstring(text)。

8.简单的使用演示

#!/usr/bin/env python
# coding=utf-8

import xml.etree.ElementTree as etree
from io import BytesIO


# https://lxml.de/tutorial.html

def test_element():
    html = etree.Element('html')  # 创建一个元素
    body = etree.Element('body')
    html.append(body)  # 添加一个子元素
    div1 = etree.SubElement(body, 'div')
    div2 = etree.SubElement(body, 'div')
    div1.set('class', 'head')
    div1.text = 'hello world!'
    div2.text = u'你好!'
    print etree.tostring(html,
                         encoding='utf-8')  # <html><body><div class="head">hello world!</div><div>你好!</div></body></html>

    child = html[0]
    print child.tag  # body
    print len(child)  # 2
    for c in body:
        print c.text  # hello world! 你好!
    p = etree.Element('p')
    body.insert(0, p)
    print len(body)  # 3
    start = body[:1]
    end = body[-1:]
    print start[0].tag  # p
    print end[0].tag  # div
    print etree.iselement(body)  # True

    print div1.get('class')  # head
    print div2.get('class')  # None
    div1.set('style', 'border: 1px solid red;')
    print div1.keys()  # ['style', 'class']
    for k, v in div1.items():
        print '%s = %s' % (k, v)  # style = border: 1px solid red; class = head
    print div1.attrib  # {'style': 'border: 1px solid red;', 'class': 'head'}

    p.text = u'一段文字'
    p.tail = u'结尾'
    print etree.tostring(html,
                         encoding='utf-8')  # <html><body><p>一段文字</p>结尾<div class="head" style="border: 1px solid red;">hello world!</div><div>你好!</div></body></html>

    for e in html.iter():
        print '%s - %s' % (e.tag, e.text)  # html - None body - None p - 一段文字 div - hello world! div - 你好!
    for e in html.iter('div'):
        print '%s - %s' % (e.tag, e.text)  # div - hello world! div - 你好!

    s = etree.tostring(html, encoding='utf-8')
    another_html = etree.XML(s)
    print etree.tostring(another_html,
                         encoding='utf-8')  # <html><body><p>一段文字</p>结尾<div class="head" style="border: 1px solid red;">hello world!</div><div>你好!</div></body></html>
    print etree.tostring(another_html, encoding='utf-8', method='text')  # 一段文字结尾hello world!你好!


def test_element_tree():
    xml = '''<?xml version="1.0"?>
    <bookshop>
        <book>
            <name>C</name>
            <author>unknown</author>
        </book>
        <book>
            <name>Algorithm</name>
            <author>GG</author>
        </book>
    </bookshop>
    '''
    tr = etree.ElementTree(xml)
    print type(tr.getroot())  # <type 'str'>
    print tr.getroot()


def test_from_string_file():
    xml = '''<?xml version="1.0"?>
    <bookshop>
        <book>
            <name>C</name>
            <author>unknown</author>
        </book>
        <book>
            <name>Algorithm</name>
            <author>GG</author>
        </book>
    </bookshop>
    '''
    e1 = etree.fromstring(xml)
    print etree.tostring(e1, encoding='utf-8')
    e2 = etree.XML(xml)
    print etree.tostring(e2, encoding='utf-8')
    tr = etree.parse(BytesIO(xml))
    print etree.tostring(tr.getroot(), encoding='utf-8')


if __name__ == '__main__':
    print 'test_element()', '*' * 100
    test_element()
    print 'test_element_tree()', '*' * 100
    test_element_tree()
    print 'test_from_string_file()', '*' * 100
    test_from_string_file()


'''
输出为:

test_element() ****************************************************************************************************
<html><body><div class="head">hello world!</div><div>你好!</div></body></html>
body
2
hello world!
你好!
3
p
div
True
head
None
['style', 'class']
style = border: 1px solid red;
class = head
{'style': 'border: 1px solid red;', 'class': 'head'}
<html><body><p>一段文字</p>结尾<div class="head" style="border: 1px solid red;">hello world!</div><div>你好!</div></body></html>
html - None
body - None
p - 一段文字
div - hello world!
div - 你好!
div - hello world!
div - 你好!
<html><body><p>一段文字</p>结尾<div class="head" style="border: 1px solid red;">hello world!</div><div>你好!</div></body></html>
一段文字结尾hello world!你好!
test_element_tree() ****************************************************************************************************
<type 'str'>
<?xml version="1.0"?>
    <bookshop>
        <book>
            <name>C</name>
            <author>unknown</author>
        </book>
        <book>
            <name>Algorithm</name>
            <author>GG</author>
        </book>
    </bookshop>
    
test_from_string_file() ****************************************************************************************************
<bookshop>
        <book>
            <name>C</name>
            <author>unknown</author>
        </book>
        <book>
            <name>Algorithm</name>
            <author>GG</author>
        </book>
    </bookshop>
<bookshop>
        <book>
            <name>C</name>
            <author>unknown</author>
        </book>
        <book>
            <name>Algorithm</name>
            <author>GG</author>
        </book>
    </bookshop>
<bookshop>
        <book>
            <name>C</name>
            <author>unknown</author>
        </book>
        <book>
            <name>Algorithm</name>
            <author>GG</author>
        </book>
    </bookshop>
'''

猜你喜欢

转载自www.cnblogs.com/Ooman/p/11163517.html
今日推荐