# xpath简介

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。用于在 XML 文档中通过元素和属性进行导航。

XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。

xpath术语

节点

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

节点关系

父(Parent)

每个元素以及属性都有一个父。

在下面的例子中,book 元素是 title、author、year 以及 price 元素的父:

<book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>

子(Children)

元素节点可有零个、一个或多个子。

在下面的例子中,title、author、year 以及 price 元素都是 book 元素的子:

<book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>

同胞(Sibling)

拥有相同的父的节点

在下面的例子中,title、author、year 以及 price 元素都是同胞:

<book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>

先辈(Ancestor)

某节点的父、父的父,等等。

在下面的例子中,title 元素的先辈是 book 元素和 bookstore 元素:

<bookstore>
​
<book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>
​
</bookstore>

后代(Descendant)

某个节点的子,子的子,等等。

在下面的例子中,bookstore 的后代是 book、title、author、year 以及 price 元素:

<bookstore>
​
<book><title>Harry Potter</title><author>J K. Rowling</author><year>2005</year><price>29.99</price>
</book>
​
</bookstore>

xpath语法

选取节点

选取节点 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

下面列出了最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点
/ 从根节点选取
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

实例:

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

谓语(Predicates)

谓语用来查找某个特定的节点或者包含某个指定的值的节点。

谓语被嵌在方括号中。

实例

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

实例

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

xpath具体使用

环境安装: pip install lxml

解析原理:

  • 实例化一个etree类型的对象,且将即将被解析的页面源码数据加载到该对象中

  • 调用该对象的xpath方法结合着不同的xpath表达式进行标签定位和数据提取

实例化对象: etree.parse(fileName) etree.HTML(page_text)

使用方法:xpath返回的一定是一个列表

  • 表达式最左侧/和//区别

  • 非最左侧的/和//区别

  • 属性定位://div[@class="name"]

  • 索引定位://div[2]

  • /text()和//text()

  • div/a/@href

<html lang="en">
<head><meta charset="UTF-8" /><title>测试bs4</title>
</head>
<body><div><p>百里守约</p></div><div class="song"><p>李清照</p><p>王安石</p><p>苏轼</p><p>柳宗元</p><a href="http://www.song.com/" title="赵匡胤" target="_self"><span>this is span</span>宋朝是最强大的王朝,不是军队的强大,而是经济很强大,国民都很有钱</a><a href="" class="du">总为浮云能蔽日,长安不见使人愁</a><img src="http://www.baidu.com/meinv.jpg" alt="" /></div><div class="tang"><ul><li><a href="http://www.baidu.com" title="qing">清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村</a></li><li><a href="http://www.163.com" title="qin">秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山</a></li><li><a href="http://www.126.com" alt="qi">岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君</a></li><li><a href="http://www.sina.com" class="du">杜甫</a></li><li><a href="http://www.dudu.com" class="du">杜牧</a></li><li><b>杜小月</b></li><li><i>度蜜月</i></li><li><a href="http://www.haha.com" id="feng">凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘</a></li></ul></div>
</body>
</html>

test.html

实例化一个tree对象

from lxml import etree
tree = etree.parse("test.html")

1.基于标签定位的xpath表达式

  • xpath方法返回值永远是一个列表

  • xpath表达式中最左侧的/和//的区别

    • /表示我们必须从根标签进行定位

    • //表示我们可以定义任意位置的标签

tree.xpath("/html/head/meta")
# [<Element meta at 0x1bd33576f08>]
​
tree.xpath("//meta")
# [<Element meta at 0x1bd33576f08>]

查找到多个

tree.xpath("//div")

输出

[<Element div at 0x1bd3223c048>,<Element div at 0x1bd33584148>,<Element div at 0x1bd33584ac8>]

2.属性定位

tree.xpath("//div[@class='song']")
# [<Element div at 0x1bd33584148>]

3.索引定位

  • 索引值是从1开始

  • 在xpath表达式中非最左侧的/和//的区别

    • /表示一个层级

    • //表示多个层级

tree.xpath("//div[@class='tang']/ul/li[3]")
# [<Element li at 0x1bd335849c8>]
​
tree.xpath("//div[@class='tang']//li[3]")

4.取文本

  • /text():获取的是标签下直系的文本数据

  • //text():获取的标签下所有的文本数据

tree.xpath("//div[@class='tang']//li[5]/a/text()")
# ['杜牧']

获取多个文本

string_list = tree.xpath("//div[@class='tang']//text()")
"".join(string_list).replace("\n","").replace("\t","")
# '清明时节雨纷纷,路上行人欲断魂,借问酒家何处有,牧童遥指杏花村秦时明月汉时关,万里长征人未还,但使龙城飞将在,不教胡马度阴山岐王宅里寻常见,崔九堂前几度闻,正是江南好风景,落花时节又逢君杜甫杜牧杜小月度蜜月凤凰台上凤凰游,凤去台空江自流,吴宫花草埋幽径,晋代衣冠成古丘'

5.取属性

  • 获取的也是一个列表

tree.xpath("//div[@class='tang']//li[5]/a/@href")
# ['http://www.dudu.com']

实例

  • 需求:爬取boss中的岗位信息(岗位名称,薪资,公司名称,岗位描述)
url = "https://www.zhipin.com/job_detail/?query=python爬虫&page=%d"
f = open("boss.txt","w",encoding="utf-8")for page in range(1,2):new_url = format(url%page)page_text = requests.get(url=new_url,headers=headers).text# xpath的数据解析tree = etree.HTML(page_text)  # tree中存储的是整张页面中对应的页面源代码li_list = tree.xpath("//div[@id='main']//div[@class='job-list']//li")# 遍历每个职位信息所在的li标签for li in li_list:job_name = li.xpath("./div/div[1]//a/div[@class='job-title']/text()")[0]salary = li.xpath("./div/div[1]//a/span/text()")[0]detail_url ='https://www.zhipin.com' + li.xpath("./div/div[1]//a/@href")[0]company_name = li.xpath("./div/div[2]/div[@class='company-text']/h3/a/text()")[0]print(job_name,salary,detail_url,company_name)# 获取职位详细要求detail_page_text = requests.get(url=detail_url,headers=headers).textdetail_tree = etree.HTML(detail_page_text)job_desc = detail_tree.xpath('//*[@id="main"]/div[3]/div/div[2]/div[2]/div[1]/div/text()')job_desc = ''.join(job_desc)f.write(job_name+":"+salary+":"+company_name+":"+job_desc+"\n\n")
f.close()

转载于:https://www.cnblogs.com/ryxiong-blog/p/11305995.html

爬虫解析库xpath相关推荐

  1. python xpath语法-Python爬虫 | 解析库Xpath的使用

    first itemsecond itemthird itemfourth itemfifth item

  2. 浅谈解析库XPath,bs4和pyquery

    <浅谈解析库XPath,bs4和pyquery> 作者:墨非墨菲非菲 前几天在CSDN看到一篇帖子,题目是"如何让自己像打王者一样发了疯,拼了命,石乐志的学习".这里面 ...

  3. 爬虫(2)-解析库xpath和beautifulsoup爬取猫眼电影排行榜前100部电影

    解析库爬取猫眼电影前100部电影 认为有用的话请点赞,码字不易,谢谢. 其他爬虫实战请查看:https://blog.csdn.net/qq_42754919/category_10354544.ht ...

  4. 爬虫-解析库的使用-Xpath

    4. 解析库的使用 对于网页节点,可以定义id.class或其他属性,且节点之间有曾是关系,可以通过Xpath 或者CSS选择器来定位一个或者多个节点,再调用相应的方法获取它的正文内容或者属性. py ...

  5. beautifulsoup解析动态页面div未展开_两个资讯爬虫解析库的用法与对比

    " 阅读本文大概需要 10 分钟. " 舆情爬虫是网络爬虫一个比较重要的分支,舆情爬虫往往需要爬虫工程师爬取几百几千个新闻站点.比如一个新闻页面我们需要爬取其标题.正文.时间.作者 ...

  6. Python爬虫 解析库的使用

    已写章节 第一章 网络爬虫入门 第二章 基本库的使用 第三章 解析库的使用 第四章 数据存储 第五章 动态网页的抓取 文章目录 已写章节 第三章 解析库的使用 3.1BeautifulSoup 3.1 ...

  7. Python网络解析库Xpath,妈妈再也不会担心我不会解析了

    本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 极客导航 即可关注,每个工作日都有文章更新. 一.概况 前两篇我们把网络库Requests大概的用法学了一遍,把网站上的每页数据请求下 ...

  8. python爬虫解析库(Xpath、beautiful soup、Jsonpath)

    1. HTML解析 HTML的内容返回给浏览器,浏览器就会解析它,并对它渲染. HTML 超文本表示语言,设计的初衷就是为了超越普通文本,让文本表现力更强. XML 扩展标记语言,不是为了代替HTML ...

  9. 《崔庆才Python3网络爬虫开发实战教程》学习笔记(4):解析库Xpath的使用方法总结

    本篇博文是自己在学习崔庆才的<Python3网络爬虫开发实战教程>的学习笔记系列,如果你也要这套视频教程的话,关注我公众号[小众技术],关注后回复[PYTHON],无套路免费送你一个学习大 ...

最新文章

  1. 运维需要掌握的基础知识
  2. 轻谈 return i++
  3. GEE windows 环境配置
  4. VUE 入坑系列 一 双向绑定
  5. char flag[20]c语言,C语言试卷
  6. 【李宏毅2020 ML/DL】P77 Generative Adversarial Network | Theory behind GAN
  7. linux设备符,linux 字符设备(一)
  8. JSch连接不上Linux服务器,JSch链接linux服务器问题解决方案:Session.connect: java.io.IOException: End of IO Stream Read...
  9. 网站使用 VideoPlayer 方法
  10. P80 例4-1 名和姓的对换问题。英国人和美国人姓名的书写形式是“名在前,姓在后”,但在有些情况下,需要把姓名写成“姓在前,名在后,中间加一个逗号”的形式。编写一个程序实现把“名在前,姓在后”的姓名
  11. 芥末圈:“知识付费”面具下的币圈割韭菜大本营
  12. 大数据发展趋势十个大方向
  13. 为什么要用“设计模式”?(六大好处)
  14. CTF中常见编码总结
  15. ps、ai超强辅助类插件,神器一样的存在
  16. (三)shp路网数据导入postgres中
  17. python下载vip素材_Python素材下载爬虫,多线程rar下载爬虫
  18. 打扰一下计算机房在哪里用英语怎么写,打扰用英语怎么说例句翻译
  19. 免费开源的商城系统!可商用!推荐给你
  20. c++ 连接mysql数据库

热门文章

  1. 遇到一个前台获取(截取)天数'日'的问题!
  2. 基于人体各种调节机制的仿生人体机器人处理机制(空想)
  3. 五种常见户外LED显示屏模组故障维修方法
  4. 基于MaixHub的小方舟分类模型学习
  5. PPT配色必学第1课——了解色值
  6. 浅谈运用计算机铺助教学体会,组织胚胎学应用计算机辅助教学的体会
  7. 雷士灯具管理系统、灯具管理系统
  8. 微信小程序wx.request接口
  9. WHMCS对接星外开通挂机宝、VPS教程(附带插件下载)
  10. New Concept book two text