节点操作:

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

lxml基础的更多相关文章

  1. 05.Python网络爬虫之三种数据解析方式

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

  2. 05,Python网络爬虫之三种数据解析方式

    回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指定数据 ...

  3. 《Python网络爬虫之三种数据解析方式》

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

  4. python网络爬虫数据中的三种数据解析方式

    一.正则解析 常用正则表达式回顾: 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字.字母.下划线 ...

  5. Scrapy笔记04- Selector详解

    Scrapy笔记04- Selector详解 在你爬取网页的时候,最普遍的事情就是在页面源码中提取需要的数据,我们有几个库可以帮你完成这个任务: BeautifulSoup是python中一个非常流行 ...

  6. Python网络爬虫之三种数据解析方式 (xpath, 正则, bs4)

    引入 回顾requests实现数据爬取的流程 指定url 基于requests模块发起请求 获取响应对象中的数据 进行持久化存储 其实,在上述流程中还需要较为重要的一步,就是在持久化存储之前需要进行指 ...

  7. python 3.x 爬虫基础---常用第三方库(requests,BeautifulSoup4,selenium,lxml )

    python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 python 3.x 爬虫基础---常用第三方库 ...

  8. Python爬虫基础之lxml

    一.Python lxml的基本应用 <html> <head> <title> The Dormouse's story </title> </ ...

  9. Python爬虫基础——XPath语法的学习与lxml模块的使用

    XPath与正则都是用于数据的提取,二者的区别是: 正则:功能相对强大,写起来相对复杂: XPath:语法简单,可以满足绝大部分的需求: 所以,如果你可以根据自己的需要进行选择. 一.首先,我们需要为 ...

随机推荐

  1. 【Matplotlib】数据可视化实例分析

    数据可视化实例分析 作者:白宁超 2017年7月19日09:09:07 摘要:数据可视化主要旨在借助于图形化手段,清晰有效地传达与沟通信息.但是,这并不就意味着数据可视化就一定因为要实现其功能用途而令 ...

  2. Java中apache下面FtpClient主动模式和被动模式

    最近在做ftp文件上传的时候,开发测试环境上传都没有问题,但是在开发环境缺无法上传,但是也没有报错,纠结了老久.最后看到网上有说FtpClient有主动模式和被动模式之分,然后就解决了. FTPCli ...

  3. SSD卡对redis的影响

    原文地址:http://antirez.com/news/52 Hello! As promised today I did some SSD testing. The setup: a Linux ...

  4. EasyUI 的 combotree 加载数据后折叠起来,并且只允许单击子节点的写法

    $(source).combotree({ url: '', width: kuan, valueField: 'id', textField: 'text', onlyLeafCheck: true ...

  5. 在 Visual Studio 生成项目时,会发现一些 dll 并没有被复制到输出目录,导致最终程序的执行错误

    发现与解决 检查了一下项目文件,发现是因为这些 dll 文件的引用其中一个叫做 嵌入互操作类型(EmbedInteropTypes)的属性被设为了 True,此时 复制本地 属性会被强制设为 Fals ...

  6. [k8s]k8s-ceph-statefulsets-storageclass-nfs 有状态应用布署实践

    k8s stateful sets storageclass 有状态应用布署实践v2 Copyright 2017-05-22 xiaogang(172826370@qq.com) 参考 由于网上的文 ...

  7. [svc]通过bridge连接单机的多个网络namespace

    ip操作物理网卡 参考: http://www.cnblogs.com/iiiiher/p/8056930.html - 查看mac/操作物理网卡 ip link - 查看ip/mac ip a - ...

  8. [k8s]jenkins配合kubernetes插件实现k8s集群构建的持续集成

    另一个结合harbor自动构建镜像的思路: 即code+baseimage一体的方案 - 程序员将代码提交到代码仓库gitlab - 钩子触发jenkins master启动一次构建 - jenkin ...

  9. 基于mindwave脑电波进行疲劳检测算法的设计(3)

    这一节我将讲解thinkgear.h 里面的函数和宏定义.这一些都可以在MindSet Development Tools\ThinkGear Communications Driver\docs\h ...

  10. 菜鸟教程之工具使用(九)——Git如何进行分支的merge操作

    今天继续我们的Git教程,Git杀手锏级的功能就是对于分支的管理,那么今天就来说说分支之间的merge操作.merge可以说是我们日常使用最多的操作之一,通常一个merge操作会包含commit.pu ...