鱼C论坛

 找回密码
 立即注册
查看: 2970|回复: 16

[技术交流] 爬虫——使用XPath——XPath提供了非常简明的路经选择表达式

[复制链接]
发表于 2019-1-6 14:54:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. from lxml import etree
  2. text = '''
  3. <div>
  4. <ul>
  5. <li class="item-0"><a href="link1.html"><span>first item</span></a></li>
  6. <li class="item-1"><a href="link2.html">second item</a></li>
  7. <li class="item-inactive"><a href="link3.html">third item</a></li>
  8. <li class="item-1"><a href="link4.html">fourth item</a></li>
  9. <li class="item-0"><a href="link5.html">fifth item</a>
  10. <ul>
  11. <div>
  12. '''
  13. html = etree.HTML(text)
  14. #所有节点
  15. #*代表匹配所有的节点,也可以匹配特点的节点
  16. result1 = html.xpath('//*')
  17. #子节点
  18. #通过/或//可查找元素的子节点和孙节点
  19. #/用于选取子节点,//用于选取孙节点,如果要获取所有子孙节点,就可以使用//
  20. result2 = html.xpath('//li/a')

  21. #父节点
  22. #查找父节点可以通过..parent::和来实现
  23. result3 = html.xpath('//a[@href="link4.html"]/../@class')
  24. result4 = html.xpath('//a[@href="link4.html"]/parent::*/@class')
  25. #匹配属性
  26. result5 = html.xpath('//li[@class="item-0"]')
  27. #文本获取
  28. result6 = html.xpath('//li[@class="item-0"]/text()')
  29. ##获取li节点内部的文本,一种先选取a节点在获取文本, 另一种就是使用//
  30. result7 = html.xpath('//li[@class="item-0"]/a/text()')
  31. result8 = html.xpath('//li[@class="item-0"]//text()')
  32. #属性获取(用@符号获取节点属性)
  33. result9 = html.xpath('//li/a/@href')

  34. text = '''
  35. <li class="li li-first" name="item"><a href="link.html">first item</a><li>
  36. '''
  37. html1 = etree.HTML(text)
  38. result10 = html1.xpath('//li[class="li"]/a/text')
  39. #这里的HTML文本中的li节点的class属性有两个值li/li-first,此时如果还想用之前的匹配获取,就无法匹配了
  40. #利用contains()方法,第一个参数传入属性名称,第二个参数传入属性值,只要此属性包含所传入的属性值就可匹配
  41. result11 = html1.xpath('//li[contains(@class,"li")]/a/text()')

  42. #多属性匹配
  43. #XPath中有and/or/mod|/+等运算符
  44. result12 = html1.xpath('//li[contains(@class, "li") and @name="item"]/a/text()')
  45. # print(result12)
  46. #按顺序选择
  47. result13 = html.xpath('//li[1]/a/text()')
  48. # print(result13)
  49. result14 = html.xpath('//li[last()]/a/text()')
  50. # print(result14)
  51. result15 = html.xpath('//li[position()<3]/a/text()')
  52. # print(result15)
  53. result16 = html.xpath('//li[last()-2]/a/text()')
  54. # print(result16)
  55. #这里的序列是从1开始的,而不是从0开始,last()是最后一个,last()-2为导数第三个,而position<3, 为前2个
  56. #在XPath中提供了100多个函数,可参考:https://www.cnblogs.com/zhangfei/archive/2013/02/27/2935264.html
  57. #节点轴选择
  58. ##调用ancetor轴,可以获取所有的祖先节点,其后需要跟两个冒号,然后是节点选择器:*表示匹配所有的节点
  59. result17 = html.xpath('//li[1]/ancestor::*')
  60. # print(result17)
  61. #在后面加上div限制,还可以加html/boby/div/ul等
  62. result18 = html.xpath('//li[1]/ancestor::div')
  63. print(result18)
  64. #调用attribute轴,可以获取所有的属性值,其后跟的选择器还是*,这代表获得该节点的所有的属性
  65. result19 = html.xpath('//li[1]/attribute::*')
  66. print(result19)
  67. #调用child轴,可以获得所有直接子节点。这里加了限定条件,选取href属性为link1.html的a节点
  68. result20 = html.xpath('//li[1]/child::a[@href="link1.html"]')
  69. print(result20)
  70. #调用descendant轴,获取孙节点。
  71. result21 = html.xpath('//li[1]/descendant::span')
  72. print(result21)
  73. #选取following轴,获取当前节点之后的所有节点,虽然使用*匹配,但加了索引
  74. result22 = html.xpath('//li[1]/following::*[2]')
  75. print(result22)
  76. #调用following-slibling轴,可以获取当前节点之后的所有同级节点
  77. result23 = html.xpath('//li[1]/following-sibling::*')
  78. print(result23)
复制代码




游客,如果您要查看本帖隐藏内容请回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-21 11:34:01 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-6 15:34:53 | 显示全部楼层
学习来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-29 20:29:08 | 显示全部楼层
666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-8 14:26:43 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-2 19:35:55 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-3 12:11:54 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-12 16:03:48 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-20 22:03:16 | 显示全部楼层
XUEXIXUEXI
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-21 15:58:51 | 显示全部楼层
感谢FishC.COM
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-7 16:55:47 | 显示全部楼层
1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-26 08:53:21 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-3-13 00:13:52 | 显示全部楼层
2346546465465
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-13 01:00:46 | 显示全部楼层
66666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-26 12:17:11 | 显示全部楼层
2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-8-1 17:22:33 | 显示全部楼层
学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-10-8 14:31:04 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-27 07:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表