网页数据解析与提取----XPath

网页数据解析与提取----XPath

XPath 使用

1、什么是XPath

XPath全称是XML Path Language,即XML路径语言,用来在XML文档中查找信息,虽然是用来查找XML文档,但同样适用于HTML文档

表达式描述
nodename选取此节点的所有子节点
/从当前节点中选取直接子节点
//从当前节点中选取子孙节点
.选取当前节点
. .选取当前节点的父节点
@选取属性

2、准备工作

1、安装 lxml 库

pip install lxml

2、案例

from lxml import etree
text = """
<div>
	<ul>
		<li class="item-0"><a href="link1.html">first item</a></li>
		<li class="item-1"><a href="link2.html">second item1</a></li>
		<li class="item-inactive"><a href="link3.html">third item</a></li>
		<li class="item-1"><a href="link4.html">four item</a></li>
		<li class="item-0"><a href="link5.html">fifth item1</a>
</div>
"""
html = etree.HTML(text)
result = etree.tostring(html)
print(result.decode('utf-8'))
etree 模块可以自动修正HTML文本

3、所有节点

一般使用以 // 开头的XPath规则,用来选取所有符合要求的节点

from lxml import etree
html = etree.parse('.test.html', etree.HTMLParser())
result = html.xpath('//*')
print(result)

4、子节点

通过 / 或者 // 即可查找元素的子节点子孙节点

from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//li/a')
print(result)

5、父节点

1)使用 … 实现获取父节点
案例

from lxml import etree
html = etree.parse('./test.html', etree.HTMLParser())
result = html.xpath('//a[@href="link4.html"]/../@class')
print(result)

2)使用 parent:: 实现获取父节点

from lxml import etree
html = etree.parse('.test.html', etree.HTMLParser())
result = html.xpath('//a[@href="link4.html"]/::*/@class'))
print(resutl)

6、属性匹配

在选取节点时,可使用@符号实现属性过滤

from lxml import etree
html = etree.parse('.test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]')
print(result)

7、文本获取

使用XPath中的text方法可以获取节点中的文本

from lxml import etree
html = etree.parse('.test.html', etree.HTMLParser())
result = html.xpath('//li[@class="item-0"]/text()')
print(result)

8、属性获取

使用@符号获取属性

from lxml import etree
html = etree.parse('.test.html', etree.HTMLParser())
result = html.xpath('//li/a@href')
print(result)

9、属性多值匹配

某些节点的某个属性可能有多个值,例如有两个值,如果用之前的那种匹配方式就无法进行,这种情况就需要用到contains方法

from lxml import etree
text = """
<li class="li li-first"><a href="link.html">first item</a></li>
"""
html = etree.HTML(text)
# contains方法给其中第一个参数传入属性名称,第二个参数传入属性值,只要传入的属性包含传入的属性值,就可完成匹配
result = html.xpath('//li[contains(@class, "li")]/a/text()')
print(result)

10、多属性匹配

有时需要根据多个属性确定一个节点,这时需要同时匹配多个属性,使用运算符and来连接多个属性

from lxml import etree
text = """
<li class="li li-first" name="item"><a href="link.html">first item</a></li>
"""
html = etree.HTML(text)
# contains方法给其中第一个参数传入属性名称,第二个参数传入属性值,只要传入的属性包含传入的属性值,就可完成匹配
result = html.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
print(result)

运算符及其介绍
在这里插入图片描述

11、按序选择

在选择节点时,某些属性可能同时匹配了多个节点,但开发者只需要其中某一个,如第二个或者最后一个,可以使用往中括号中传入索引的方法获取特定次序的节点

from lxml import etree
text = """
<div>
	<ul>
		<li class="item0"><a href="link1.html">first item</a></li>
		<li class="item1"><a href="link2.html">sexond item</a></li>
		<li class="item-inactive"><a href="link3.html">third item</a></li>
		<li class="item1"><a href="link4.html">four item</a></li>
		<li class="item0"><a href="link5.html">fifth item</a></li>
	</ul>
</div>
"""
html = etree.HTML(text)
# 选取第一个li节点
result = html.xpath('//li[1]/a/text()')
print(result)
# 选取最后一个li节点
result = html.xpath('//li[last()]/a/text()')
print(result)
# 选取位置小于3的li节点
result = html.xpath('//li[position()<3]/a/text()')
print(result)
# 选取倒数第三个li节点
result = html.xpath('//li[las()-2)]/a/text()')
print(result)

12、节点轴选择

XPath提供了很多节点轴的选择方法,包括获取子元素、兄弟元素、父元素、祖先元素等

from lxml import etree
text = """
<div>
	<ul>
		<li class="item0"><a href="link1.html">first item</a></li>
		<li class="item1"><a href="link2.html">sexond item</a></li>
		<li class="item-inactive"><a href="link3.html">third item</a></li>
		<li class="item1"><a href="link4.html">four item</a></li>
		<li class="item0"><a href="link5.html">fifth item</a></li>
	</ul>
</div>
"""
html = etree.HTML(text)
# 调用ancestor轴,可获取所有祖先节点
result = html.xpath('//li[1]/ancestor::*')
print(result)
# 获取只有div的祖先节点
result = html.xpath('//li[1]/ancestor::div')
print(result)
# 调用attribute轴,获取所有属性值,后面跟着*代表获取节点的所有属性,返回值就是li节点的所有属性值
result = html.xpath('//li[1]/attribute::*')
print(result)
# 调用child轴,获取所有直接子节点,悬着href属性为link1.html的a节点
result = html.xpath('//li[1]/child::a[@href="link1.html"]')
print(result)
# 调用descendant轴,可获取所有子孙节点,只包含span节点
result = html.xpath('//li[1]/descendant::span')
print(result)
# 调用following轴,获取当前节点之后的所有节点
result = html.xpath('//li[1]/following::*[2]')
print(result)
# 调用following-sibling轴,可获取当前节点之后的所有同级节点
result = html.xpath('//li[1]/following-sibling::*')
print(result)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值