前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据解析之 XPath & lxml 库

数据解析之 XPath & lxml 库

作者头像
村雨遥
发布2022-06-15 09:23:46
4470
发布2022-06-15 09:23:46
举报
文章被收录于专栏:JavaPark

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库

安装

使用如下命令安装即可,

代码语言:javascript
复制
pip install lxml

使用

代码语言:javascript
复制
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库,介绍了它们的安装方式和简单的使用方式,如果你有更好的建议和想法,欢迎留言指正。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-11-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • XPath
    • 定义
      • 开发工具
        • 语法
          • 注意事项
          • lxml库
            • 安装
              • 使用
              • 总结
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档