设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1606|回复: 0

xpath解析

[复制链接]

8

主题

50

金钱

87

积分

新手用户

发表于 2019-11-1 15:08:04 | 显示全部楼层 |阅读模式

1、简介及安装
简介:XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。
安装:pip install lxml
调用方法:
  1. # 先导包
  2. from lxml import etree

  3. # 将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点
  4. # 1. 本地文件
  5. tree = etree.parse(文件名)
  6. tree.xpath("xpath表达式")

  7. # 2. 网络数据
  8. tree = etree.HTML(网页内容字符串)
  9. tree.xpath("xpath表达式")
复制代码


2、语法简介
先准备一个HTML格式的字符串
  1. html_doc = """
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5.     <meta charset="UTF-8">
  6.     <title>Title</title>
  7. </head>
  8. <body>

  9. <div class="d1">
  10.     <div class="d2">
  11.             <p class="story">
  12.                 <a  class="sister" id="link1">Elsie</a>,
  13.                 <a  class="sister" id="link2">Lacie</a> and
  14.                 <a  id="link3">Tillie</a>
  15.             </p>
  16.     </div>
  17.     <div>
  18.         <p id="p1">人生苦短</p>
  19.         <p id="p2">我用python</p>
  20.     </div>
  21. </div>

  22. <div class="d3">
  23.     <a >baidu</a>
  24.     <p>百度</p>
  25. </div>

  26. </body>
  27. </html>
  28. """
复制代码


#1,选取节点
  1. nodename     # 选取nodename节点的所有子节点         xpath(‘//div’)         # 选取了所有div节点
  2. /            # 从根节点选取                        xpath(‘/div’)          # 从根节点上选取div节点
  3. //           # 选取所有的当前节点,不考虑他们的位置    xpath(‘//div’)         # 选取所有的div节点
  4. .            # 选取当前节点                        xpath(‘./div’)         # 选取当前节点下的div节点
  5. ..           # 选取当前节点的父节点                 xpath(‘..’)            # 回到上一个节点
  6. @            # 选取属性                           xpath(’//@calss’)     # 选取所有的class属性

  7. #######################⬇例子⬇######################

  8. ret=selector.xpath("//div")
  9. ret=selector.xpath("/div")
  10. ret=selector.xpath("./div")
  11. ret=selector.xpath("//p[@id='p1']")
  12. ret=selector.xpath("//div[@class='d1']/div/p[@class='story']")
复制代码


#2,谓语
  1. 表达式                                         结果
  2. xpath(‘/body/div[1]’)                     # 选取body下的第一个div节点
  3. xpath(‘/body/div[last()]’)                # 选取body下最后一个div节点
  4. xpath(‘/body/div[last()-1]’)              # 选取body下倒数第二个div节点
  5. xpath(‘/body/div[positon()<3]’)           # 选取body下前两个div节点
  6. xpath(‘/body/div[@class]’)                # 选取body下带有class属性的div节点
  7. xpath(‘/body/div[@class=”main”]’)         # 选取body下class属性为main的div节点
  8. xpath(‘/body/div[@price>35.00]’)          # 选取body下price元素值大于35的div节点

  9. #######################⬇例子⬇######################

  10. ret=selector.xpath("//p[@class='story']//a[2]")
  11. ret=selector.xpath("//p[@class='story']//a[last()]")
复制代码


#3,通配符
Xpath通过通配符来选取未知的XML元素
  1. 表达式                 结果
  2. xpath(’/div/*’)     # 选取div下的所有子节点
  3. xpath(‘/div[@*]’)    # 选取所有带属性的div节点

  4. #######################⬇例子⬇######################

  5. ret=selector.xpath("//p[@class='story']/*")
  6. ret=selector.xpath("//p[@class='story']/a[@class]")
复制代码


#4,取多个路径
使用 “|” 运算符可以选取多个路径
  1. 表达式                         结果
  2. xpath(‘//div|//table’)    # 选取所有的div和table节点

  3. #######################⬇例子⬇######################

  4. ret=selector.xpath("//p[@class='story']/a[@class]|//div[@class='d3']")
  5. print(ret)
复制代码


#5,Xpath轴
轴可以定义相对于当前节点的节点集
  1. 轴名称                      表达式                                  描述
  2. ancestor                xpath(‘./ancestor::*’)              # 选取当前节点的所有先辈节点(父、祖父)
  3. ancestor-or-self        xpath(‘./ancestor-or-self::*’)      # 选取当前节点的所有先辈节点以及节点本身
  4. attribute               xpath(‘./attribute::*’)             # 选取当前节点的所有属性
  5. child                   xpath(‘./child::*’)                 # 返回当前节点的所有子节点
  6. descendant              xpath(‘./descendant::*’)            # 返回当前节点的所有后代节点(子节点、孙节点)
  7. following               xpath(‘./following::*’)             # 选取文档中当前节点结束标签后的所有节点
  8. following-sibing        xpath(‘./following-sibing::*’)      # 选取当前节点之后的兄弟节点
  9. parent                  xpath(‘./parent::*’)                # 选取当前节点的父节点
  10. preceding               xpath(‘./preceding::*’)             # 选取文档中当前节点开始标签前的所有节点
  11. preceding-sibling       xpath(‘./preceding-sibling::*’)     # 选取当前节点之前的兄弟节点
  12. self                    xpath(‘./self::*’)                  # 选取当前节点
复制代码


#6,功能函数
使用功能函数能够更好的进行模糊搜索
  1. 函数                  用法                                                               解释
  2. starts-with         xpath(‘//div[starts-with(@id,”ma”)]‘)                        # 选取id值以ma开头的div节点
  3. contains            xpath(‘//div[contains(@id,”ma”)]‘)                           # 选取id值包含ma的div节点
  4. and                 xpath(‘//div[contains(@id,”ma”) and contains(@id,”in”)]‘)    # 选取id值包含ma和in的div节点
  5. text()              xpath(‘//div[contains(text(),”ma”)]‘)                        # 选取节点文本包含ma的div节点
复制代码



3、ELement对象
  1. from lxml.etree import _Element
  2. for obj in ret:
  3.     print(obj)
  4.     print(type(obj))  # from lxml.etree import _Element

  5. '''
  6. Element对象

  7. class xml.etree.ElementTree.Element(tag, attrib={}, **extra)

  8.   tag:string,元素代表的数据种类。
  9.   text:string,元素的内容。
  10.   tail:string,元素的尾形。
  11.   attrib:dictionary,元素的属性字典。
  12.   
  13.   #针对属性的操作
  14.   clear():清空元素的后代、属性、text和tail也设置为None。
  15.   get(key, default=None):获取key对应的属性值,如该属性不存在则返回default值。
  16.   items():根据属性字典返回一个列表,列表元素为(key, value)。
  17.   keys():返回包含所有元素属性键的列表。
  18.   set(key, value):设置新的属性键与值。

  19.   #针对后代的操作
  20.   append(subelement):添加直系子元素。
  21.   extend(subelements):增加一串元素对象作为子元素。#python2.7新特性
  22.   find(match):寻找第一个匹配子元素,匹配对象可以为tag或path。
  23.   findall(match):寻找所有匹配子元素,匹配对象可以为tag或path。
  24.   findtext(match):寻找第一个匹配子元素,返回其text值。匹配对象可以为tag或path。
  25.   insert(index, element):在指定位置插入子元素。
  26.   iter(tag=None):生成遍历当前元素所有后代或者给定tag的后代的迭代器。#python2.7新特性
  27.   iterfind(match):根据tag或path查找所有的后代。
  28.   itertext():遍历所有后代并返回text值。
  29.   remove(subelement):删除子元素。
  30. '''
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表