数据解析之XPath & lxml库

版权声明:个人博客网站:https://cunyu1943.github.io/, 欢迎访问留言交流,转载请注明出处! https://blog.csdn.net/github_39655029/article/details/84058962

XPath

  • 定义

即XML路径语言(XML Path Language),是一种用来确定XML文档中某部分位置的语言,它基于XML的树状结构,提供在数据结构树中寻找节点的能力,也适用于HTML文档中;

  • 开发工具

    • Chrome
      在Chrome的应用商店搜索XPath Helper,然后安装这个插件即可;

    • Firefox
      同样的方式,在应用中心查找XPath Checker,然后安装这个插件即可,由于未使用Firefox,便不再演示;

  • 语法

    • 节点选取
表达式 描述 示例
nodename 选词当前节点下节点的所有子节点 div
/ 若在最前,则表示从根节点开始选取,否则选择某节点下的某个节点 /div
// 从全局节点中选取某一节点所在所有位置 //div
@ 选取某一节点属性 //div[@color]
. 选取当前节点 ./div
选取当前节点的父节点 …/div
  • 谓语
路径表达式 描述
/markstore/mark[1] 选取markstore下第一个元素
/markstore/mark[last()] 选取markstore下倒数第二个mark元素
markstore/mark[position()<5] 选取markstore下前四个子元素
//mark[@id] 选取拥有id的mark元素
//mark[@id=‘k’] 选取id属性为k的mark元素
  • 通配符
通配符 描述
* 匹配任意节点
@* 匹配节点中的任意属性
node() 匹配任何类型的节点

注意事项

  • 使用方式://获取当前页面所有元素,然后写标签名,最后写谓词进行提取;
  • /和//的区别:/代表只获取直接子节点,//代表获取子孙节点;

lxml库

安装

使用如下命令安装即可,

pip install lxml

使用

from lxml import etree

text = '''
<div>
    <ul>
        <li class="id-1"><a href="www.baidu.com">baidu</a></li>
        <li class="id-2"><a href="www.google.com">Google</a></li>
        <li class="id-3 id-4" name='item'><a href="www.taobao.com">Taobao</li>
    </ul>
</div>
'''
# 解析字符串为html文档
html = etree.HTML(text)
# 字符串序列化为html文档,会自动修正HTML文本
result = etree.tostring(html, encoding='utf-8')
print(result.decode('utf-8'))

# 从文件读取
parser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('csdn.html', parser=parser)

# 获取所有a标签的href属性
aList = html.xpath('//a/@href')
for a in aList:
    print(a)

# 属性多值匹配
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "id-4")/href/text()]')
print(result)

# 多属性匹配
html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "id-4") and @name="item"]/href/text()')
print(result)

# 按序选择
text = """
<div> 
<ul> 
<li class="item-0"><a href="link1.html">first item</a></li> 
<li class="item-1"><a href="link2.html">second item</a></li> 
<li class="item-inactive"><a href="link3.html">third item</a></li> 
<li class="item-1"><a href="link4.html">fourth item</a></li> 
<li class="item-0"><a href="links.html">fifth item</a></li> 
</ul> 
</div>
"""
html = etree.HTML(text)
# 注意,xpath匹配中序号是以1开头的,而不是以0开头的
result = html.xpath('//li[1]/a/text()')
print(result)
result = html.xpath('//li[last()]/a//text()')
print(result)
result = html.xpath('//li[last()-2]/a/text()')
print(result)
result = html.xpath('//li[position()<3]/a/text()')
print(result)

总结

本文主要介绍了爬虫中数据解析时所需要的用的XPath和lxml库,介绍了它们的安装方式和简单的使用方式,如果你有更好的建议和想法,欢迎留言指正。

猜你喜欢

转载自blog.csdn.net/github_39655029/article/details/84058962