节点操作:

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. Atlas+Keepalived系列一:安装Atlas:

    1:下载Atlas https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm 2:安装A ...

  2. 逼格高又实用的Linux高级命令,开发运维都要懂!

    在运维的坑里摸爬滚打好几年了,我还记得我刚开始的时候,我只会使用一些简单的命令,写脚本的时候,也是要多简单有多简单,所以有时候写出来的脚本又长又臭. 像一些高级点的命令,比如说 Xargs 命令.管道 ...

  3. Apache学习---多进程处理模块(MPM)原理详解

    查看Apache的模式,可以使用httpd -V命令来查看: 1. prefork MPM prefork模式可以算是很古老但是非常稳定的Apache模式.Apache在启动之初,就预先fork一些子 ...

  4. Effective Java 第三版——52. 明智而审慎地使用重载

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  5. Mybatis 记录

    1. #{}, ${}两种传参数方式的区别 1) ${} 会将传入的参数完全拼接到sql语句中,也就是相当于一个拼接符号. 也就是,最后的处理方式就相当于 String sql = select * ...

  6. 让ASP.NET Web API支持$format参数的方法

    在不使用OData的情况下,也可以让ASP.NET Web API支持$format参数,只要在WebApiConfig里添加如下三行红色粗体代码即可: using System; using Sys ...

  7. Arrays.asList中所遇到的坑

    前言 最近在项目上线的时候发现一个问题,从后台报错日志看:java.lang.UnsupportedOperationException异常 从代码定位来看,原来是使用了Arrays.asList() ...

  8. Atitit 大json文件的结构化查看解决方案,高性能的jsonview  attilax总结.docx

    Atitit 大json文件的结构化查看解决方案,高性能的jsonview  attilax总结.docx 1.1. 实现目标:1 1.2. 实现key与value类型的..一直分析到非 jsonob ...

  9. java协变逆变,PECS

    public static void main(String[] args) { // Object <- Fruit <- Apple <- RedApple System.out ...

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

    时隔两个多月了,前段时间在弄Socket,就没有弄这个了.现在好了,花了几天的时间,终于又完成了一小部分了.这一小节主要讲α,β,δ,θ等等波段之间的关系.废话不多说,直接给出这几天的成果. 上一次, ...