目前有很多xml,html文档的parser,如标准库的xml.etree , beautifulsoup  ,  还有lxml. 都用下来感觉lxml不错,速度也还行,就他了.

围绕三个问题:

  • 问题1:有一个XML文件,如何解析
  • 问题2:解析后,如果查找、定位某个标签
  • 问题3:定位后如何操作标签,比如访问属性、文本内容等

这些操作应该算是比较基础的,参考教程中文版,官网更详细一点,进阶xpath语法,要在以后操作xml文件和html文件用上.

#!/usr/bin/python
# coding=utf-8
# __author__='dahu'
#
'''
Element是XML处理的核心类,
Element对象可以直观的理解为XML的节点,大部分XML节点的处理都是围绕该类进行的。
这部分包括三个内容:节点的操作、节点属性的操作、节点内文本的操作。
'''
from lxml import etree # 1.创建element
root = etree.Element('root')
print root, root.tag # 2.添加子节点
child1 = etree.SubElement(root, 'child1')
child2 = etree.SubElement(root, 'child2') # 3.删除子节点
# root.remove(child2) # 4.删除所有子节点
# root.clear() # 5.以列表的方式操作子节点
print(len(root))
print root.index(child1) # 索引号
root.insert(0, etree.Element('child3')) # 按位置插入
root.append(etree.Element('child4')) # 尾部添加 # 6.获取父节点
print(child1.getparent().tag)
# print root[0].getparent().tag #用列表获取子节点,再获取父节点
'''以上都是节点操作''' # 7.创建属性
# root.set('hello', 'dahu') #set(属性名,属性值)
# root.set('hi', 'qing') # 8.获取属性
# print(root.get('hello')) #get方法
# print root.keys(),root.values(),root.items() #参考字典的操作
# print root.attrib #直接拿到属性存放的字典,节点的attrib,就是该节点的属性
'''以上是属性的操作''' # 9.text和tail属性
# root.text = 'Hello, World!'
# print root.text # 10.test,tail和text的结合
html = etree.Element('html')
html.text = 'html.text'
body = etree.SubElement(html, 'body')
body.text = 'wo ai ni'
child = etree.SubElement(body, 'child')
child.text='child.text' #一般情况下,如果一个节点的text没有内容,就只有</>符号,如果有内容,才会<>,</>都有
child.tail = 'tails' # tail是在标签后面追加文本
print(etree.tostring(html))
# print(etree.tostring(html, method='text')) # 只输出text和tail这种文本文档,输出的内容连在一起,不实用 #11.Xpath方式
# print(html.xpath('string()')) #这个和上面的方法一样,只返回文本的text和tail
print(html.xpath('//text()')) #这个比较好,按各个文本值存放在列表里面
tt=html.xpath('//text()')
print tt[0].getparent().tag #这个可以,首先我可以找到存放每个节点的text的列表,然后我再根据text找相应的节点
# for i in tt:
# print i,i.getparent().tag,'\t', #12.判断文本类型
print tt[0].is_text,tt[-1].is_tail #判断是普通text文本,还是tail文本
'''以上都是文本的操作''' #13.字符串解析,fromstring方式
xml_data = '<html>html.text<body>wo ai ni<child>child.text</child>tails</body></html>'
root1=etree.fromstring(xml_data) #fromstring,字面意思,直接来源字符串
# print root1.tag
# print etree.tostring(root1) #14.xml方式
root2 = etree.XML(xml_data) #和fromstring基本一样,
print etree.tostring(root2) #15.文件类型解析
tree =etree.parse('text') #文件解析成元素树
root3 = tree.getroot() #获取元素树的根节点
print etree.tostring(root3,pretty_print=True) parser= etree.XMLParser(remove_blank_text=True) #去除xml文件里的空行
root = etree.XML("<root> <a/> <b> </b> </root>",parser)
print etree.tostring(root) #16.html方式
xml_data1='<root>data</root>'
root4 = etree.HTML(xml_data1)
print(etree.tostring(root4))#HTML方法,如果没有<html>和<body>标签,会自动补上
#注意,如果是需要补全的html格式:这样处理哦
with open("quotes-1.html",'r')as f:
a=H.document_fromstring(f.read().decode("utf-8")) for i in a.xpath('//div[@class="quote"]/span[@class="text"]/text()'):
print i #17.输出内容,输出xml格式
print etree.tostring(root)
print(etree.tostring(root, xml_declaration=True,pretty_print=True,encoding='utf-8'))#指定xml声明和编码
'''以上是文件IO操作''' #18.findall方法
root = etree.XML("<root><a x='123'>aText<b/><c/><b/></a></root>")
print(root.findall('a')[0].text)#findall操作返回列表
print(root.find('.//a').text) #find操作就相当与找到了这个元素节点,返回匹配到的第一个元素
print(root.find('a').text)
print [ b.text for b in root.findall('.//a') ] #配合列表解析,相当帅气!
print(root.findall('.//a[@x]')[0].tag) #根据属性查询
'''以上是搜索和定位操作'''
print(etree.iselement(root))
print root[0] is root[1].getprevious() #子节点之间的顺序
print root[1] is root[0].getnext()
'''其他技能'''
# 遍历元素数
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"
etree.SubElement(root[0], "childson").text = "son 1"
# for i in root.iter(): #深度遍历
# for i in root.iter('child'): #只迭代目标值
# print i.tag,i.text
# print etree.tostring(root,pretty_print=True)
												

python lxml教程的更多相关文章

  1. Python爬虫教程-25-数据提取-BeautifulSoup4(三)

    Python爬虫教程-25-数据提取-BeautifulSoup4(三) 本篇介绍 BeautifulSoup 中的 css 选择器 css 选择器 使用 soup.select 返回一个列表 通过标 ...

  2. Python爬虫教程-24-数据提取-BeautifulSoup4(二)

    Python爬虫教程-24-数据提取-BeautifulSoup4(二) 本篇介绍 bs 如何遍历一个文档对象 遍历文档对象 contents:tag 的子节点以列表的方式输出 children:子节 ...

  3. Python爬虫教程-23-数据提取-BeautifulSoup4(一)

    Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据,查看文档 https://www.crummy.com/software/BeautifulSoup/bs4/doc. ...

  4. Python爬虫教程-22-lxml-etree和xpath配合使用

    Python爬虫教程-22-lxml-etree和xpath配合使用 lxml:python 的HTML/XML的解析器 官网文档:https://lxml.de/ 使用前,需要安装安 lxml 包 ...

  5. Python快速教程 尾声

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基 ...

  6. 【Python大系】Python快速教程

    感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库, ...

  7. CentOS 5系统安装Django、Apache 、mod_wsgi部署Python环境教程

    Django,是一款针对Python环境的WEB开发框架,能够帮助我们构架快捷.简单的WEB框架设置,Django框架非常适合开发内容应用环境,所以在本文中,麦子将整理基于Centos系统部署安装Dj ...

  8. 《Python算法教程》译者序

    在计算机的世界中,算法本质上是我们对某一个问题或者某一类问题的解决方案.也就是说,如果我们想用计算机来解决问题的话,就必须将问题的解决思路准确而完整地描述出来,同时计算机也要能理解这个描述.这需要我们 ...

  9. 改写《python基础教程》中的一个例子

    一.前言 初学python,看<python基础教程>,第20章实现了将文本转化成html的功能.由于本人之前有DIY一个markdown转html的算法,所以对这个例子有兴趣.可仔细一看 ...

随机推荐

  1. SFM学习

    摘自李翠http://www.cnblogs.com/serser/p/6598621.html SFM 1.相机模型,内参数和外参数矩阵,相机标定: 2.极线约束和本征矩阵:特征点提取与匹配:提取到 ...

  2. Codeforces 17.E Palisection

    E. Palisection time limit per test 2 seconds memory limit per test 128 megabytes input standard inpu ...

  3. sloop公共程序之总体描述

    1:功能需求 开发一个公共库文件sloop.c,实现三个常用功能以供其它模块调用.三个功能如下: 功能一:实现一般的信号监听,调用模块只需传入要监听的信号和相应的回调函数就可以在信号到时调用回调函数处 ...

  4. C++ ------ 创建对象 new 和不 new 的区别

    1.作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了,(安全不会造成内存系统泄漏). 用new:创建的是指向类对象的指针,作用域变成了全局,当程序结束时,必须 ...

  5. Qt ------ 断开某对信号与槽的connect

    QMetaObject::Connection dis; dis = connect(this,&TcpSocket::readyRead,this,&TcpSocket::readD ...

  6. Redis 为什么用跳表而不用平衡树

    Redis 为什么用跳表而不用平衡树? 本文是<Redis内部数据结构详解>系列的第六篇.在本文中,我们围绕一个Redis的内部数据结构--skiplist展开讨论. Redis里面使用s ...

  7. MingW和MSVC默认的编码方式不一样

    同一份源代码,源文件编码格式为UTF-8: string tmp = "我"; ;i<tmp.size();++i) { printf("%0x ",tm ...

  8. Java实现线性表-顺序表示和链式表示

    顺序表示和链式表示的比较: 1.读写方式:顺序表可以顺序存取,也可以随机存取:链表只能从表头顺序存取元素: 2.逻辑结构与物理结构:顺序存储时,逻辑上相邻的元素其对应的物理存储位置也相邻:链式存储时, ...

  9. [linux]codeblocks开发mysql配置

    1.在安装好mysql后,可以应该安装必要的库文件 $sudo apt-get install libmysqlclient-dev 2.将codeblocks与mysql的库文件连接起来 在code ...

  10. 【BZOJ】3963: [WF2011]MachineWorks

    [题意]给定n台在时间di可以买入的机器,pi买入,可在任意时间ri卖出,买入和卖出之间的持有时间每天产生gi金钱,任意时间至多持有一台机器.给定初始钱数c和总天数T,求最大收益.n<=10^5 ...