Python公开课 - 页面解析之XPath

前言

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。

XPath最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索。所以在做爬虫时,可以使用 XPath 来做相应的页面解析。

XPath常用规则

  • nodename - 选取此节点的所有子节点
  • / - 从当前节点选取直接子节点
  • // - 从当前节点选取子孙节点
  • . - 选取当前节点
  • .. - 选取当前节点的父节点
  • @ 选取属性

举个简单的例子进行说明:

//p[@lang=’english') 

这就是一个 XPath 规则,它代表选择所有名称为p,且属性lang 的值为english的节点。

XPath节点

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

from lxml import etree
import lxml.html
text = '''
  <html>
  <body>
    <div>
      <ul>
        <li class="item-0">
          <a href="linkl.html">0 item</a>
        </li>
        <li class="item-1">
          <a href="link2.html">2 item</a>
        </li>
        <li class="item-inactive item-1">
          <a href="link3.html">3 item</a>
        </li>
        <li class="item-2">
          <a href="link4.html">4 item</a>
        </li>
        <li class="item-3">
          <a href="links5.html">5 item</a>
        </li>
      </ul>
    </div>
  </body>
  </html>'''
html = lxml.html.fromstring(text)
result= etree.tostring(html)
print(result.decode('utf8'))

父节点 - Parent

在上面的例子中,ul节点是所有li的父节点,li是a的父节点

子节点 - Children

同理li是ul的子节点,a是li的子节点

同胞 - Sibling

所有的ul节点下的li节点都是同胞

先辈 - Ancestor

a的先辈包括li, ul, div等

子孙 - Descendant

所有节点都是html节点的子孙

查找

按属性查找

我们还可以用@符号进行属性过滤,比如如果要选取class为item-0 的li节点,可以这样实现:

result = html.xpath('//li[@class="item-0"]')
print(result)

输出:
[<Element li at 0x7f8431bc5548>]

包含关系属性查找

通过 contains()方法,第一个参数传人属性名称,第二个参数传人属性值,只要此属性包含所传入的属性值,就可以完成匹配了:

result = html.xpath('//li[contains(@class,"item-inactive")]/a/text()')
print(result)

输出:
['3 item']

多属性精确查找

and 其实是 XPath 中的运算符号,通过它可以实现多条件匹配:

result = html.xpath('//li[contains(@class,"item-inactive") and contains(@class,"item-1")]/a/text()')
print(result)

输出:
['3 item']

按顺序查找

这里我们使用了last()函数来选择最后一个,我们也可以有更多函数可以进行操作,参见XPath常用函数总结

result = html.xpath('//li[last()]/a/text()')
print(result)

输出:
['5 item']

节点轴查找

我们调用了 ancestor 轴,可以获取所有祖先节点。 其后需要跟两个冒号,然后是 节点的选择器,这里我们直接使用*,表示匹配所有节点,

result = html.xpath('//li[1]/ancestor::*')
print(result)

输出:
[<Element html at 0x7f48976dcef8>, <Element body at 0x7f48976f2548>, <Element div at 0x7f4897682c78>, <Element ul at 0x7f4897682d68>]

数据抽取

文本获取

用 XPath 中的 text()函数获取节点中的文本:

result = html.xpath('//li[@class="item-3"]/a/text()')
print(result)

输出:
['5 item']

属性获取

用@符号来获取属性值:

result = html.xpath('//li/a/@href')
print(result)

输出:
['linkl.html', 'link2.html', 'link3.html', 'link4.html', 'links5.html']

小结

本章基本上把可能用到的 XPath 选择器介绍完了。 XPath 功能非常强大,内置函数非常多, 熟练使用之后,可以非常方便的对页面进行内容提取。

相关阅读


相关推荐
  1. 铅山县傍罗乡私立学校塘尾总校
  2. 易中天给英雄武汉的一首诗 - 武汉新鲜事
  3. 脱单!武汉的相亲角在哪你知道吗?
  4. 梧鼠技穷
  5. 会长大的彗星蛋
  6. 南京市建邺区南京市奥体艺术幼儿园 - 南京幼儿园黄页
  7. 抓包工具Charles安装及使用
  8. 西安市莲湖区吉的堡锦园幼儿园 - 西安幼儿园黄页
  9. 枣庄市底阁中学
  10. 上海市进才中学北校羽山路校区
  11. 一骑红尘妃子笑
  12. 长春市榆树市阳光金宝贝幼稚园 - 长春幼儿园黄页
  13. Python公开课 - 异常处理
  14. 天津市和平区劝业场小学
  15. 奥迪客户不满加价,被武汉4S店销售群殴
  16. 郑州管城回族区外国语小学(原城东路一小)
  17. 北京市朝阳区牌坊快乐宝贝幼儿园 - 北京幼儿园黄页
  18. 丁娘娘
  19. 武汉女子网上做兼职被骗六十五万
  20. Python公开课 - Ubuntu 升级到Python3.6及对应的pip
  21. 事发武汉农夫山泉矿泉水内惊现大量虫卵
  22. Python公开课 - 爬虫介绍
  23. 萃河不老情
  24. 宁乡县大屯营乡紫林完小
  25. 江门市荷塘镇梅溪小学
  26. 山海关第三中学
  27. XPath常用函数整理总结
  28. 武汉动物园火烈鸟孔雀排队打疫苗
  29. 杭州市景华小学
  30. 蔺相如完壁归赵
  31. 深圳市龙岗区溪涌小学
  32. 曲阜市鲁城街道孔子中学
  33. 新生儿血液黄疸值范围是多少 - 育儿经验
  34. 给网站加上永久免费SSL的证书
  35. 上海市松江区新凯幼儿园 - 上海幼儿园黄页
  36. 武汉一女子七天被骗220万
  37. 太原市万柏林区狮头双语幼儿园 - 太原幼儿园黄页
  38. 武汉市汉阳区旺斯达国际幼儿园 - 武汉幼儿园黄页
  39. 嘉兴一中实验经开学校
  40. 西塘坨小学
  41. 江苏扬中高级中学
  42. 邹城市千泉街孟子小学
  43. OpenJDK与Oracle JDK的区别
  44. 哭泣的蝴蝶
  45. Java Web Services介绍
  46. 潍坊市育才学校(中学部)
  47. 武汉00后大二学妹拍视频月入七十万
  48. 小山羊过桥
  49. 郭村中心幼儿园 - 保定幼儿园黄页
  50. 百名网媒总编辑登上知音号欣赏武汉夜色
  51. 他杀死了我的狗
  52. 桂林市恭城瑶族自治县满天星幼儿园 - 桂林幼儿园黄页
  53. 央媒聚焦!国庆假期173.78万人次打卡大美黄陂
  54. 狐狸小姐的红舞鞋
  55. 北京师范大学亚太实验学校
  56. 上海市杨浦区开鲁新村第一小学(开鲁新村一小)
  57. Python公开课 - 标准库Thread详解
  58. 大同煤矿集团公司第一中学
  59. Python公开课 - 爬虫之代理
  60. 沈阳市大东培智学校