Python

Python 外置模块 lxml

2022-08-27  本文已影响0人  大狗熊熊熊熊熊

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()')
上一篇 下一篇

猜你喜欢

热点阅读