第4章 解析库的使用---Xpath

lxml、Beautiful Soup、pyquery三个解析库

1、使用XPath

XML Path Language,XML路径语言。

举例://title[@lang='eng'],选择所有名称为title,属性lang的值为eng的节点。

from lxml import etree
# 导入lxml库中的etree模块

html=etree.HTML(text)
# 调用HTML类进行初始构造XPath解析对象html
# 对于HTML文本中的不闭合节点,etree模块可自动修正HTML文本

result=etree.tostring(html)
# 输出修正后的HTML代码,结果为bytes类型

print(result.decoding('utf-8'))
# 将bytes类型转换为str类型

# 所有节点,xpath匹配以//开头
html=etree.parse('./test.html',etree.HTMLParse())
# ./test.html表示该文件夹下的test.html文件

result=html.xpath('//*')
# *代表匹配所有节点,整个html文本中所有节点都会被获取

result=html.xpath('//li')
# 匹配所有li节点,第一个节点索引为0

# 通过/或// 查找元素的子节点或者子孙节点
result=html.xpath('//li/a')
# 所有li节点的所有直接a子节点
result=html.xpath('//ul//a')
# /选取直接子节点,//获取所有子孙节点,获取ul节点下的所有子孙a节点

# ..用于查找父节点
result=html.xpath('//a[@href="link4.html"]/../@class')
# 选取href属性为link4.html的a节点,然后再选取其父节点,再获取其class属性
# 另外一种操作
result=html.xpath('//a[@href="link4.html"]/parent::*/@class')

# 属性匹配
result=html.xpath('//li[@class="item=0"]')
# 选取所有class属性为item-0的li节点

# 文本获取
# <li class ="item -0"><a href="links.html">fifth item</a> 
  </li>
result=html.xpath('//li[@class="item-0"]/text()')
# 选取所有class属性为item-0的li节点的直接文本内容,结果是:\n
result=html.xpath('//li[@class="item-0"]/a/text()')
# 选取所有class属性为item-0的li节点的直接子节点a的文本内容,结果是:fifth item
result=html.xpath('//li[@class="item-0"]//text()')
# 选取所有class属性为item-0的li节点下的所有文本内容,结果是:fifth item和\n
# 综上,为了安全起见,选取到特定的子孙节点,再调用text()方法获取其内部文本

# 属性获取
result=html.xpath('//li/a/@href')
# 获取所有li节点下所有a节点的href属性
# 注意,属性匹配中括号加属性名和值来限定某个属性,如[@href="link1.html"]
# @href指的是获取节点的herf属性,以列表的形式返回

#属性的多值匹配
<li class="li li-first"><a href =” link.html first item</a></li> 
result=html.xpath('//li[contains(@class,"li")]/a/text()')
# contains()方法,第一个参数传入属性名称,第二个参数传入属性值,只有包含此符合条件的属性值,就可以完成匹配

# 多属性匹配
<li class="li li-first" name="item"><a href="link.html" >first item</a></li> 
result=html.xpath('//li[contains(@class,"li") and @name="item"]/a/text()')
# 需要根据class和name属性来选择,则中间需要用and操作符相连,相连之后置于括号内进行条件筛选
# 结果是:['first item']
# 除了and操作符之外,还有其他运算符,见文章末尾表4-2

# 按序选择,同时匹配到了多个节点,只想要其中的某个节点,如第二个节点或者最后一个节点,该如何?
result=html.xpath('//li[1]/a/text()') #选取第一个li节点,注意此处序号以1开头的
result=html.xpath('//li[last()]/a/text()') #选取最后一个li节点
result=html.xpath('//li[position()<3]/a/text()') 
# 选取位置小于3的节点,也就是位置序号为1和2的节点
result=html.xpath('//li[last()-2]/a/text()') #选取倒数第三个节点
# last()、position()等函数,具体应用参考:http://www.w3school.com.cn/xpath/xpath_functions.asp

# 节点轴选择,选取子元素,兄弟元素,父元素,祖先元素等
result=html.xpath('//li[1]/ancestor::*') #获取所有祖先节点
result=html.xpath('//li[1]/ancestor::div') #获取所有=div的祖先节点
result=html.xpath('//li[1]/attribute::*') #获取节点的所有属性
result=html.xpath('//li[1]/child::a[@href="link1.html"]') 
# 获取所有直接子节点,选取href属性为link1.html的a节点
result=html.xpath('//li[1]/descendant::span')
# 获取所有子孙节点,返回只包含span节点
result=html.xpath('//li[1]/following::*[2]')
# 获取第二个后续节点
result=html.xpath('//li[1]/following-sibling::*')
# 获取当前节点之后的所有同级节点,也就是获取了所有后续同级节点




表4-2 运算符及其介绍
发布了92 篇原创文章 · 获赞 23 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/Pit3369/article/details/86583785