>>> html = etree.Element('html')
>>> body = etree.SubElement(html, 'body')
>>> body.text = 'Text'
>>> print(etree.tostring(html))
b'
Text'>>> br = etree.SubElement(body, 'br')
>>> print(etree.tostring(html))
b'
Text'
# tail仅在该标签后面追加文本
>>> br.tail = 'Tail'
>>> print(etree.tostring(br))
b'
Tail'
>>> print(etree.tostring(html))
b'
TextTail'
# 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
文件解析与输出
这一节回答问题1。
这部分讲述如何将XML文件解析为 Element 对象,以及如何将 Element 对象输出为XML文件。1、文件解析
文件解析常用的有 fromstring 、 XML 和 HTML 三个方法。接受的参数都是字符串。>>> xml_data = 'data'
# fromstring方法
>>> root1 = etree.fromstring(xml_data)
>>> print(root1.tag)
root
>>> print(etree.tostring(root1))
b'data'
# XML方法,与fromstring方法基本一样
>>> root2 = etree.XML(xml_data)
>>> print(root2.tag)
root
>>> print(etree.tostring(root2))
b'data'
# HTML方法,如果没有和
标签,会自动补上>>> root3 = etree.HTML(xml_data)
>>> print(root3.tag)
html
>>> print(etree.tostring(root3))
b'
data'2、输出
输出其实就是前面一直在用的 tostring 方法了,这里补充 xml_declaration和 encoding 两个参数,前者是XML声明,后者是指定编码。>>> root = etree.XML('')
>>> print(etree.tostring(root))
b''
# XML声明
>>> print(etree.tostring(root, xml_declaration=True))
b"<?xml version='1.0' encoding='ASCII'?>\n"
# 指定编码
>>> print(etree.tostring(root, encoding='iso-8859-1'))
b"<?xml version='1.0' encoding='iso-8859-1'?>\n"
ElementPath
这一节回答问题2。
讲 ElementPath 前,需要引入 ElementTree 类,一个 ElementTree 对象可理解为一个完整的XML树,每个节点都是一个 Element 对象。而 ElementPath 则相当于XML中的XPath。用于搜索和定位 Element 元素。这里介绍两个常用方法,可以满足大部分搜索、查询需求,它们的参数都是XPath语句:
findall():返回所有匹配的元素,返回列表
find():返回匹配到的第一个元素 >>> root = etree.XML("aText")
# 查找第一个b标签
>>> print(root.find('b'))
None
>>> print(root.find('a').tag)
a
# 查找所有b标签,返回Element对象组成的列表
>>> [ b.tag for b in root.findall('.//b') ]
['b', 'b']
# 根据属性查询
>>> print(root.findall('.//a[@x]')[0].tag)
a
>>> print(root.findall('.//a[@y]'))
[]
参考: