lxml功能:解析XML文件和HTML文件
lxml的常用模块etree包含的常用类有
1.Element类:用于处理XML的节点
Element类操作节点的方法有
1.node=etree.Element('p') 《构建类型为P的标签节点》
2.node.tag 《获取node节点的名称》
3.node=etree.Element('p',id='NODEONE') 《构建类型为P的标签,并且设置id为NODEONE》
4.node.set('class','classone') 《给node节点添加class为classone属性》
5.node.text = 'hello linzhou' 《给node节点赋予文本值》
6.
2.ElementTree类:用于处理XML的文档树
xmlData = '<p>林州欢迎你</p>'
1.etree.fromstring(xmlData)
2.etree.XML(xmlData)
3.etree.HTML(xmlData)
《解析XML文件解析为树结构》
4.etree.parse('./xmlData')
《解析指定的xml文件》
5.
3.ElementPath类:用于处理XML文件的内容
1.ElementTree.find(XPATH语句) 《返回满足XPATH语句的第一个元素》
2.ElementTree.findall(XPATH语句) 《返回满足XPATH语句的元素,以列表形式呈现》
3.ElementTree.iterfind(XPATH语句) 《返回满足XPATH语句的元素,以迭代方式【generator】呈现》
4.ElementTree.xpath(XPATH语句) 《返回满足XPATH语句的元素,以列表形式呈现》
例:
XMLData=" \
<div id=“DIVID” class="divclass"> \
<p id="PID" class="pclass"> \
Hello very one \
<p>Welcome to Linzhou</p> \
<span>The TaiHang Canyon welcome to you</span> \
<span>The Red Flag Canal welcome to you</span> \
</p> \
</div>"
sourceData = lxml.etree.XML(XMLData)
print(lxml.etree.tounicode(sourceData.find('p')))
print(lxml.etree.tounicode(sourceData.find('./p')))
《输出div下第一个p节点,并包括该p节点之下的所有子节点》
这里输出:
<p id="PID" class="pclass">Hello very one<p>Welcome to Linzhou</p><span>The TaiHang Canyon welcome to you</span><span>The Red Flag Canal welcome to you</span></p>
print(lxml.etree.tounicode(sourceData.find('./p/span')))
《输出p节点下第一个span节点,并包括该span节点之下的所有子节点》
这里输出:
<span>The TaiHang Canyon welcome to you</span>
print(lxml.etree.tounicode(sourceData.find('div')))
print(lxml.etree.tounicode(sourceData.find('./div')))
《输出None》
for key in sourceData.findall('p'):
for key in sourceData.findall('./p'):
print(etree.tounicode(key))
《输出一个列表,且只有1个内容,内容与find("p")相同》
for key in sourceData.findall('.//p'):
for key in sourceData.findall('.//span'):
《输出一个列表,第一个语句输出所有p元素,第二个输出所有span元素》
这里第一个语句输出:
<p id="PID" class="pclass">Hello very one<p>Welcome to Linzhou</p><span>The TaiHang Canyon welcome to you</span><span>The Red Flag Canal welcome to you</span></p>
<p>Welcome to Linzhou</p>
第二个语句输出:
<span>The TaiHang Canyon welcome to you</span>
<span>The Red Flag Canal welcome to you</span>
for key in sourceData.iterfind('p'):
for key in sourceData.iterfind('./p'):
print(etree.tounicode(key))
《输出一个算法,且只有1个算法,内容与find("p")相同》
for key in sourceData.iterfind('./p[@class="pclass"]'):
《输出属性为class属性值为pclass的p元素》
这里输出:
<p id="PID" class="pclass">Hello very one<p>Welcome to Linzhou</p><span>The TaiHang Canyon welcome to you</span><span>The Red Flag Canal welcome to you</span></p>
result = sourceData.xpath('//span[last()-1]')
print(result[0].text)
result = sourceData.xpath('./p/descendant::span[last()-1]/text()')
print(result)
《输出所有span标签的倒数第二个span的文本值》
这里输出:
The TaiHang Canyon welcome to you
result = sourceData.xpath('/descendant::span')
print(result[1].text)
result = sourceData.xpath('/descendant::span/text()')
print(result)
《在当前节点的后代里找到span标签,并输出第二个span标签的文本值》
这里输出:
The Red Flag Canal welcome to you
result = sourceData.xpath('./p/@class')
print(result)
《输出p节点下的所有节点的class属性》
这里输出:
['pclass']
XPATH语法
1.nodename 《返回此nodename节点的所有子节点》
2./nodename 《从根节点选取nodename节点》
3.//nodename 《从当前节点出发选取所有nodename节点,忽视其子孙关系》
4..nodename 《选取当前nodename节点》
5...nodename 《选取nodename节点的父节点》
6.@name 《选取name属性》
7.* 《匹配任何节点》
8.@* 《匹配任何属性节点》
9./nodename[1] 《选取第一个nodename节点》
10./nodename[last()] 《选取最后一个nodename节点》
11./nodename[last()-1] 《选取倒数第二个nodename节点》
XPATH语法特点
1.如果XPATH表达式中最后一个是元素,那么整个返回的list都是元素【Element对象】
例:sourceData.xpath('//p/span')
2.如果XPATH表达式中最后一个是属性,那么整个返回的list都是属性字符串
例:sourceData.xpath('//p/@class')
3.如果XPAH表达式最后一个是内容,那么整个返回的list都是内容字符串
例:sourceData.xpath('//p//text()')