XPath解析(二)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: XPath解析(二)

接上文 XPath解析(一)https://developer.aliyun.com/article/1615871

获取父节点
在获取一个节点的父亲节点时,可以使用“…"来实现,以获取所有a节点的父亲节点为例,代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :2/4/22 12:21 PM
# 文件      :获取一个节点的父节点.py
# IDE      :PyCharm


from lxml import etree    # 导入etree子模块
# 定义html字符串
html_str = '''
<div class="level_one on">
<ul>
<li><a href="/index/index/view/id/1.html" title="什么是Java" class="on">什么是Java</a></li>
<li> <a href="javascript:" οnclick="login(0)" title="Java的版本">Java的版本</a> </li>
</ul>
</div>
'''
html = etree.HTML(html_str)    # 解析html字符串
a_all_parent = html.xpath('//a/..')   # 获取所有a节点的父节点
print('所有a的父节点',a_all_parent)    # 打印所有a的父节点
print('获取指定a的父节点:',a_all_parent[0])  # 打印指定a的父节点
a_txt = etree.tostring(a_all_parent[0],encoding = "utf-8")   # 转换字符串类型,并进行编码
# 打印指定节点的HTML代码
print('获取指定节点HTML代码:\n',a_txt.decode('utf-8'))

程序运行结果如下:

所有a的父节点 [<Element li at 0x7f7ee1766300>, <Element li at 0x7f7ee1766340>]
获取指定a的父节点: <Element li at 0x7f7ee1766300>
获取指定节点HTML代码:
 <li><a href="/index/index/view/id/1.html" title="什么是Java" class="on">什么是Java</a></li>

说 明

除了使用“…“获取一个节点的父节点以外,还可以使用”/parent:😗“的方式来获取

获取文本
使用XPath获取HTML代码中的文本时,可以使用text()方法。例如:获取所有a节点中的文本信息。代码如下:

from lxml import etree    # 导入etree子模块
# 定义html字符串
html_str = '''
<div class="level_one on">
<ul>
<li><a href="/index/index/view/id/1.html" title="什么是Java" class="on">什么是Java</a></li>
<li> <a href="javascript:" οnclick="login(0)" title="Java的版本">Java的版本</a> </li>
</ul>
</div>
'''
html = etree.HTML(html_str)    # 解析html字符串
a_text = html.xpath('//a/text()')   # 获取所有a节点中的文本信息
print('所有a节点中文本信息:',a_text)

程序运行结果如下:

所有a节点中文本信息: ['什么是Java', 'Java的版本']

属性匹配
1.属性匹配

如果需要更精确地获取某个节点中的内容,可以使用“[@…]“实现节点属性的匹配,其中”…"表示属性匹配的条件。例如,获取所有class="level"中的所有div节点。代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :2/4/22 12:37 PM
# 文件      :使用text()方法获取HTML代码中的文本.py
# IDE      :PyCharm

from lxml import etree    # 导入etree子模块
# 定义html字符串
html_str = '''
<div class="level_one on">
<ul>
<li><a href="/index/index/view/id/1.html" title="什么是Java" class="on">什么是Java</a></li>
<li> <a href="javascript:" οnclick="login(0)" title="Java的版本">Java的版本</a> </li>
</ul>
</div>
'''
html = etree.HTML(html_str)    # 解析html字符串
a_text = html.xpath('//a/text()')   # 获取所有a节点中的文本信息
print('所有a节点中文本信息:', a_text)

程序运行结果如下:

['什么是Java', 'Java的版本']

说 明

使用“[@…]“实现属性匹配时,不仅可以用于class属性的匹配,还可以用于id、href等属性匹配。

2. 属性多值匹配

如果某个节点的某个属性出现例多个值时,可以将所有值作为匹配条件,进行节点的筛选。代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :2/4/22 1:29 PM
# 文件      :属性多值匹配进行节点内容的筛选.py
# IDE      :PyCharm

from lxml import etree    # 导入etree子模块
# 定义html字符串
html_str = '''
<div class="video_scroll">
    <div class="level one">什么是Java</div>
    <div class="level">Java的版本</div>
</div>
'''
html = etree.HTML(html_str)    # 解析html字符串
# 获取所有class="level one"的div节点中的文本信息
div_one = html.xpath('//div[@class="level one"]/text()')
print(div_one)     # 打印class="level one"的div中文本

程序运行结果如下:

['什么是Java']

如果需要即获取class="level one"又获取class="level"的div节点时,可以使用contains()方法,该方法中有两个参数,第一个参数用于指定属性名称,第二个参数用于指定属性值,如果HTML代码中包含指定的属性值,就可以匹配成功。关键代码如下:

html = etree.HTML(html_str)    # 解析html字符串
# 获取所有class属性值中包含level的div节点中的文本信息
div_all = html.xpath('//div[contains(@class,"level")]/text()')
print(div_all)     # 打印所有符合条件的文本信息

程序运行结果如下:

['什么是Java', 'Java的版本']

3、多属性匹配

通过属性匹配HTML代码的节点时,还会遇到一种情况:那就是一个节点中出现多个属性,这时就需要同时匹配多个属性,才可以更精确地获取指定节点中的数据。示例代码如下:

#_*_coding:utf-8_*_
# 作者      :liuxiaowei
# 创建时间   :2/4/22 1:53 PM
# 文件      :一个节点中多个属性的匹配.py
# IDE      :PyCharm

from lxml import etree    # 导入etree子模块
# 定义html字符串
html_str = '''
<div class="video_scroll">
    <div class="level" id="one">什么是Java</div>
    <div class="level">Java的版本</div>
</div>
'''
html = etree.HTML(html_str)    # 解析html字符串
# 获取所有符合class="level与id="one"的div节点中的文本信息
div_all = html.xpath('//div[@class="level" and @id="one"]/text()')
print(div_all)     # 打印所有符合条件的文本信息

程序运行结果如下:

['什么是Java']

从以上运行结果可以看出,这里只匹配了属性class="level"与属性id=“one"的div节点,因为代码中使用了and运算符,该运算符表示"与”。XPath中还提供了很多运算符,其他运算符如下表所示:
image.png
image.png

相关文章
|
开发者
数据解析之Xpath解析(超详细定位)2
数据解析之Xpath解析(超详细定位)2
76 0
数据解析之xpath 太6了
数据解析之xpath 太6了
|
2月前
|
索引 Python
XPath解析之获取属性
XPath解析(三)
46 10
|
2月前
|
XML 数据格式
XPath解析(一)
XPath解析(一)
46 10
|
5月前
|
XML 数据采集 前端开发
四:《智慧的网络爬虫》— 数据解析之xpath解析
本篇文章主要讲述了数据解析中的xpath解析,及相对路径的定位语法。最后以爬取豆瓣top250首页作为示例总结
95 5
四:《智慧的网络爬虫》—  数据解析之xpath解析
|
5月前
|
XML 数据格式 Python
Python使用xpath对解析内容进行数据提取
在前面的文章当中,已经教大家如何去获取我们需要的数据原文内容,今天就介绍一个用于提取所需数据的方法之一xpath。在后续会讲解bs4(beautifulsoup),re正则表达式。
|
5月前
|
XML 数据格式 Python
Python使用xpath对解析内容进行数据提取
今天就介绍一个用于提取所需数据的方法之一xpath。在后续会讲解bs4(beautifulsoup),re正则表达式。
|
5月前
|
XML Web App开发 JavaScript
解析神器Xpath详解+实战
解析神器Xpath详解+实战
|
索引 Python
【Python】数据解析—Xpath解析
【Python】数据解析—Xpath解析
65 0
|
XML 数据格式 开发者
数据解析之Xpath解析(超详细定位)1
数据解析之Xpath解析(超详细定位)1
252 0

推荐镜像

更多