二分类数据集 正则表达式 Netty CPU acm jpa uiviewcontroller swiftui mockito 找公司做网站 jq遍历 iot系统 oracle连接字符串 git下载代码到本地命令 linux撤销 matlab读入图片 python正则 python界面 python操作mongodb python创建对象 python实例教程 python中集合 java调用接口 java定义字符串 java文件输入输出 html实例教程 易语言进度条 路由器有辐射吗 wine模拟器 刷声望 疯狂java讲义 JScodeblocks汉化包 中维高清监控系统安装 3d看图软件 斑驳纹理 求字符串长度 linux格式化硬盘 stata flash教程 画图3d
当前位置: 首页 > 学习教程  > python

python爬虫之XPath

2021/2/6 22:23:01 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

文章目录一、XPath简介1.1 什么是XPath1.2 XML和HTML的区别1.3 XPath的节点关系1.3.1 节点类型1.3.2 节点关系二、XPath语法2.1 实例化etree对象2.2 选取节点2.3 选取未知节点2.4 谓语2.5 选取若干路径三、常用函数四、XPath案例案例一:4k图片解析下载案例二&#x…

文章目录

  • 一、XPath简介
    • 1.1 什么是XPath
    • 1.2 XML和HTML的区别
    • 1.3 XPath的节点关系
      • 1.3.1 节点类型
      • 1.3.2 节点关系
  • 二、XPath语法
    • 2.1 实例化etree对象
    • 2.2 选取节点
    • 2.3 选取未知节点
    • 2.4 谓语
    • 2.5 选取若干路径
  • 三、常用函数
  • 四、XPath案例
    • 案例一:4k图片解析下载
    • 案例二:全国城市名称爬取

一、XPath简介

1.1 什么是XPath

  • XPath 使用路径表达式在 XML 文档中进行导航
  • XPath 包含一个标准函数库
  • XPath 是 XSLT 中的主要元素
  • XPath 是一个 W3C 标准

1.2 XML和HTML的区别

  • XML 不是 HTML 的替代,而是对HTML的补充
  • XML 和 HTML 为不同的目的而设计:
    • XML 被设计为传输和存储数据,其焦点是数据的内容。
    • HTML 被设计用来显示数据,其焦点是数据的外观。
    • HTML 旨在显示信息,而 XML 旨在传输信息
  • XML 最好的描述是:XML 是独立于软件和硬件的信息传输工具

1.3 XPath的节点关系

1.3.1 节点类型

  • 节点类型:在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点

1.3.2 节点关系

节点关系说明
父(Parent)每个元素及属性都有一个父
子(Children)元素节点可有零个、一个或多个子
同胞(Sibling)拥有相同的父的节点
先辈(Ancestor)某节点的父、父的父等等
后代(Descendant)某个节点的子、子的子等等

二、XPath语法

2.1 实例化etree对象

  • etree.parse(filePath):将本地的html文档中的源码数据加载到etree对象中
  • etree.HTML(html):将互联网上获取的源代码(也可以直接赋一段字符串)加载到etree对象中

2.2 选取节点

  • XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式:
表达式描述
nodename选取此节点的所有子节点
/从根节点选取,表示的是一个层级
//从匹配选择的当前节点选择文档中的节点,不考虑它们的位置,表示多个层级
.选取当前节点
..选取当前节点的父节点
@attrName选取属性为attrName的属性值
  • 示例代码
# 导入etree
from lxml import etree

html = '''
<html>
  <head>
    <title lang="en">XPath</title>
  </head>
  <body>
  	<p class='p1'>这是一个无序列表</p>
  	<div>
  		<ul>
  			<li>C++</li>
  			<li>Java</li>
		</ul>
  	</div>
    <p class = 'p2'></p>
  	<a href="https://www.baidu.com/"/>百度一下你就知道</a>
  </body>
</html>
'''
tree = etree.HTML(html)

// 1. 选取根元素html
print(tree.xpath('/html'))
# [<Element html at 0x2abb0540308>]

// 2. 选择根元素html的直系子元素head
print(tree.xpath('/html/head'))
# [<Element head at 0x2abb05404c8>]

// 3. 选择文档中的所有li标签,返回一个列表,列表中的每一个元素都是ELement对象
print(tree.xpath('//li'))
# [<Element li at 0x2abb0540c48>, <Element li at 0x2abb0540088>]

// 4. 选择html元素后代中的所有li标签,这些li标签都是html元素的子元素
print(tree.xpath('/html//li'))
# [<Element li at 0x2abb05404c8>, <Element li at 0x2abb0540f88>]

// 5. 选择属性为lang的属性值
print(tree.xpath('//@lang'))
# ['en']

2.3 选取未知节点

  • XPath 通配符可用来选取未知的 XML 元素。
通配符描述
*匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型的节点
  • 示例代码
from lxml import etree

html = '''
<html>
  <head>
    <title lang="en">XPath</title>
  </head>
  <body>
  	<p class='p1'>这是一个无序列表</p>
  	<div>
  		<ul>
  			<li>C++</li>
  			<li>Java</li>
		</ul>
  	</div>
    <p class = 'p2'></p>
  	<a href="https://www.baidu.com/"/>百度一下你就知道</a>
  </body>
</html>
'''

tree = etree.HTML(html)

// 1. 选择html标签下的所有直系子元素(head,body)
print(tree.xpath('/html/*'))
# [<Element head at 0x2abb0545408>, <Element body at 0x2abb0545cc8>]

// 2. 选择文档中的所有元素(每一个标签是一个元素,比如两个li标签就是两个不同的元素)
print(tree.xpath('//*'))
# [<Element html at 0x2abb0540208>, <Element head at 0x2abb0545cc8>, <Element title at 0x2abb05454c8>, <Element body at 0x2abb05458c8>, <Element p at 0x2abb0545b08>, <Element div at 0x2abb0545488>, <Element ul at 0x2abb0545c88>, <Element li at 0x2abb0545a88>, <Element li at 0x2abb0545ac8>, <Element p at 0x2abb0545948>, <Element a at 0x2abb0545348>]

// 3. 选择所有带有属性的p元素
print(tree.xpath('//p[@*]'))
# [<Element p at 0x2abb0545408>, <Element p at 0x2abb05458c8>]

2.4 谓语

  • 谓语:用来查找某个特定节点或包含某个指定的值的节点,被镶嵌在方括号中。
谓语说明
[n]用来选择第n个节点,n从1开始
//ul/li[3]表示获取所有ul标签下的第3个li标签的内容
[last()]选取最后一个节点
[last()-1]选取倒数第2个节点
[position() < 3]选取前两个节点
[@class]选取拥有class属性的节点
[@class=‘value’]选取class属性等于value的节点

2.5 选取若干路径

  • 通过在路径表达式中使用"|"运算符,选取若干个路径
路径表达式结果
/html/head | /html/body选择html元素下的直系子元素head和body
/html//p | /html//li选择文档中所有的p元素和li元素
/html/head/title | // a选择html元素下的直系子元素head的直系子元素title 和 文档中所有的a元素
  • 示例代码
from lxml import etree

html = '''
<html>
  <head>
    <title lang="en">XPath</title>
  </head>
  <body>
  	<p class='p1'>这是一个无序列表</p>
  	<div>
  		<ul>
  			<li>C++</li>
  			<li>Java</li>
		</ul>
  	</div>
    <p class = 'p2'></p>
  	<a href="https://www.baidu.com/"/>百度一下你就知道</a>
  </body>
</html>
'''
tree = etree.HTML(html)



// 1. 选择html元素下的直系子元素head和body,得到的是一个列表
print(tree.xpath('/html/head | /html/body'))
# [<Element head at 0x2abb0574348>, <Element body at 0x2abb0574188>]

// 2. 选择文档中所有的p元素和li元素
print(tree.xpath('/html//p | /html//li'))
# [<Element p at 0x2abb05740c8>, <Element li at 0x2abb0574a48>, <Element li at 0x2abb0574508>, <Element p at 0x2abb0574288>]

// 3. 选择html元素下的直系子元素head的直系子元素title  
//	  和 文档中所有的a元素
print(tree.xpath('/html/head/title | // a'))
# [<Element title at 0x2abb0574c88>, <Element a at 0x2abb0574288>]

三、常用函数

  1. contains函数:匹配属性对应的属性值中含有字符串str的元素
#上面的代码直接拿过来了
<p class='p1'>这是一个无序列表</p>
<p class = 'p2'></p>
 
// 1. 匹配 class 属性的属性值中含有p1的元素
print(tree.xpath('//p[contains(@class,"p1")]'))
# [<Element p at 0x2abb0566188>]

// 2. 匹配 class 属性中属性值中含有p的元素
print(tree.xpath('//p[contains(@class,"p")]'))
# [<Element p at 0x2abb055fc08>, <Element p at 0x2abb055fac8>]
  1. text()函数
    • /text():显示的是标签中直系的文本内容
    • //text():标签下所有的文本内容
// 1. body标签直系的文本内容
print(tree.xpath('/html/body/text()'))
# ['\n  \t', '\n  \t', '\n    ', '\n  \t', '百度一下你就知道\n  ']

// 2. body标签下所有的文本内容
print(tree.xpath('/html/body//text()'))
# ['\n  \t', '这是一个无序列表', '\n  \t', '\n  \t\t', '\n  \t\t\t', 'C++', '\n  \t\t\t', 'Java', '\n\t\t', '\n  \t', '\n    ', '\n  \t', '百度一下你就知道\n  ']
  1. starts-with函数:匹配 属性 对应的属性值是否以字符串str开头
// 匹配 class 属性的属性值以 p 开头的 p标签
print(tree.xpath('//p[starts-with(@class,"p")]'))
# [<Element p at 0x2abb05593c8>, <Element p at 0x2abb0559c48>]

推荐参考:
       python Xpath语法的使用:https://www.jb51.net/article/200717.htm

四、XPath案例

案例一:4k图片解析下载

案例二:全国城市名称爬取


本文链接:
http://www.dtmao.cc/news_show_2000047.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?