python lxml教程
目前有很多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教程的更多相关文章
- Python爬虫教程-25-数据提取-BeautifulSoup4(三)
Python爬虫教程-25-数据提取-BeautifulSoup4(三) 本篇介绍 BeautifulSoup 中的 css 选择器 css 选择器 使用 soup.select 返回一个列表 通过标 ...
- Python爬虫教程-24-数据提取-BeautifulSoup4(二)
Python爬虫教程-24-数据提取-BeautifulSoup4(二) 本篇介绍 bs 如何遍历一个文档对象 遍历文档对象 contents:tag 的子节点以列表的方式输出 children:子节 ...
- Python爬虫教程-23-数据提取-BeautifulSoup4(一)
Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据,查看文档 https://www.crummy.com/software/BeautifulSoup/bs4/doc. ...
- Python爬虫教程-22-lxml-etree和xpath配合使用
Python爬虫教程-22-lxml-etree和xpath配合使用 lxml:python 的HTML/XML的解析器 官网文档:https://lxml.de/ 使用前,需要安装安 lxml 包 ...
- Python快速教程 尾声
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基 ...
- 【Python大系】Python快速教程
感谢原作者:Vamei 出处:http://www.cnblogs.com/vamei 怎么能快速地掌握Python?这是和朋友闲聊时谈起的问题. Python包含的内容很多,加上各种标准库.拓展库, ...
- CentOS 5系统安装Django、Apache 、mod_wsgi部署Python环境教程
Django,是一款针对Python环境的WEB开发框架,能够帮助我们构架快捷.简单的WEB框架设置,Django框架非常适合开发内容应用环境,所以在本文中,麦子将整理基于Centos系统部署安装Dj ...
- 《Python算法教程》译者序
在计算机的世界中,算法本质上是我们对某一个问题或者某一类问题的解决方案.也就是说,如果我们想用计算机来解决问题的话,就必须将问题的解决思路准确而完整地描述出来,同时计算机也要能理解这个描述.这需要我们 ...
- 改写《python基础教程》中的一个例子
一.前言 初学python,看<python基础教程>,第20章实现了将文本转化成html的功能.由于本人之前有DIY一个markdown转html的算法,所以对这个例子有兴趣.可仔细一看 ...
随机推荐
- 手脱UPX v0.89.6 - v1.02
声明: 只为纪录自己的脱壳历程,高手勿喷 这个壳的脱法很多一般都一步直达的,步过我喜欢ESP定律 1.载入OD,在入口下一行ESP定律运行一次 > pushad ; //入口 BE mov es ...
- varchar字段
varchar 最长26000多,实际使用最好不要超过255,会占内存 可以考虑text
- mysql 中delete和trncate区别
mysql中删除表记录delete from和truncate table的用法区别: MySQL中有两种删除表中记录的方法:(1)delete from语句,(2)truncate table语句. ...
- js闭包及问题的解决
闭包定义,作用 闭包就是能够读取其他函数内部变量的函数. 作用:一个是可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中 缺点:闭包会保存函数中的变量在内存中,导致内存消耗大 闭包会 ...
- 在服务器上运行Jar包
在服务器上运行Jar包 并且该Jar包依赖其他的Jar文件的时候,采用如下格式 java -Djava.ext.dirs=你依赖的Jar文件路径 -jar 你要运行的Jar文件 包名+类名 例如: j ...
- 【算法日记】Dijkstra最短路径算法
上一篇再说广度优先搜索的适合提到了图. 狄克斯拉特算法是在图的基础上增加了 加权图的概念.就是节点和节点之间是有不同距离的 1.算法实例 用Dijkstra算法找出以A为起点的单源最短路径步骤如下 算 ...
- VC6完整项目代码升级到VS2010
VC6完整项目代码升级到VS2010,有需要请联系我,专业C++开发,邮箱153786575@qq.com
- 动态规划:插头DP
这种动归有很多名字,插头DP是最常见的 还有基于连通性的动态规划 轮廓线动态规划等等 超小数据范围,网格图,连通性 可能算是状态压缩DP的一种变式 以前我了解的状压DP用于NP难题的小数据范围求解 这 ...
- stat命令--文件权限属性设置
stat命令文件权限属性设置 stat命令用于显示文件的状态信息. stat命令的输出信息比ls命令的输出信息要更详细. 语法 stat(选项)(参数) 选项 -L:支持符号连接: -f:显示文件系统 ...
- JAVA多线程提高十一:同步工具Exchanger
Exchanger可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视 ...