接上文 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中还提供了很多运算符,其他运算符如下表所示: