最近在研究kafka,看了一堆理论的东西,想动手实践一些东西,奈何手上的数据比较少,突发奇想就打算写个爬虫去抓一些数据来玩,顺便把深入一下爬虫技术。

之前写过一些小爬虫,一般就是用python的requests+lxml来爬取数据。这次打算学一下python的scrapy框架来爬取数据。解析网页内容还是打算用lxml,lxml使用了xpath语法,由于太久没用都忘光了。所以打算重新学习一下xpath语法,并做个总结,方便以后忘了可以马上回顾。

一、xpath介绍

XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。

XPath 使用路径表达式在 XML 文档中进行导航

XPath 包含一个标准函数库

XPath 是 XSLT 中的主要元素

XPath 是一个 W3C 标准

节点

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

二、xpath语法

表达式描述

nodename

选取此节点的所有子节点。

/

从根节点选取。

//

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。

.

选取当前节点。

..

选取当前节点的父节点。

@

选取属性。

例子

以下面这个xml为例子

Harry Potter

29.99

Learning XML

39.95

xml.xpath(“bookstore”) 表示选取 bookstore 元素的所有子节点

xml.xpath(“/bookstore”) 表示选取根元素 bookstore。

xml.xpath(“bookstore/book”) 选取属于 bookstore 的子元素的所有 book 元素。

xml.xpath(“//book”) 选取所有 book 子元素,而不管它们在文档中的位置。

xml.xpath(“bookstore//book”) 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。

xml.xpath(“//@lang”) 选取名为 lang 的所有属性。

谓语

路径表达式结果

/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。

选取未知节点

通配符描述

*

匹配任何元素节点。

@*

匹配任何属性节点。

node()

匹配任何类型的节点。

例子:

路径表达式结果

/bookstore/*

选取 bookstore 元素的所有子元素。

//*

选取文档中的所有元素。

//title[@*]

选取所有带有属性的 title 元素。

选取若干路径

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

//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。

//title | //price 选取文档中的所有 title 和 price 元素。

/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

三、轴

轴可定义相对于当前节点的节点集。

轴名称结果

ancestor

选取当前节点的所有先辈(父、祖父等)。

ancestor-or-self

选取当前节点的所有先辈(父、祖父等)以及当前节点本身。

attribute

选取当前节点的所有属性。

child

选取当前节点的所有子元素。

descendant

选取当前节点的所有后代元素(子、孙等)。

descendant-or-self

选取当前节点的所有后代元素(子、孙等)以及当前节点本身。

following

选取文档中当前节点的结束标签之后的所有节点。

namespace

选取当前节点的所有命名空间节点。

parent

选取当前节点的父节点。

preceding

选取文档中当前节点的开始标签之前的所有节点。

preceding-sibling

选取当前节点之前的所有同级节点。

self

选取当前节点。

步的语法:

轴名称::节点测试[谓语]

例子:

例子结果

child::book

选取所有属于当前节点的子元素的 book 节点。

attribute::lang

选取当前节点的 lang 属性。

child::*

选取当前节点的所有子元素。

attribute::*

选取当前节点的所有属性。

child::text()

选取当前节点的所有文本子节点。

child::node()

选取当前节点的所有子节点。

descendant::book

选取当前节点的所有 book 后代。

ancestor::book

选择当前节点的所有 book 先辈。

ancestor-or-self::book

选取当前节点的所有 book 先辈以及当前节点(如果此节点是 book 节点)

child::*/child::price

选取当前节点的所有 price 孙节点。

四、一些函数

1. starts-with函数

获取以xxx开头的元素

例子:xpath(‘//div[stars-with(@class,”test”)]’)

2 contains函数

获取包含xxx的元素

例子:xpath(‘//div[contains(@id,”test”)]’)

3 and

与的关系

例子:xpath(‘//div[contains(@id,”test”) and contains(@id,”title”)]’)

4 text()函数

例子1:xpath(‘//div[contains(text(),”test”)]’)

例子2:xpath(‘//div[@id=”“test]/text()’)

五、一个lxml的xpath示例

#coding=utf-8

from lxml import etree

html = '''

友情链接查询 - 站长工具

Top News

World News only on this page

Ah, and here's some more text, by the way.

... and this is a parsed fragment ...

青少年发展基金会

洛克王国

奥拉星

手机游戏

手机壁纸

4399小游戏

91wan游戏

'''

page = etree.HTML(html.lower().decode('utf-8'))

hrefs = page.xpath(u"//a")

for href in hrefs:

print href.attrib

打印出的结果为:

{‘href’: ‘http://www.cydf.org.cn/‘, ‘target’: ‘_blank’, ‘rel’: ‘nofollow’}

{‘href’: ‘http://www.4399.com/flash/32979.htm‘, ‘target’: ‘_blank’}

{‘href’: ‘http://www.4399.com/flash/35538.htm‘, ‘target’: ‘_blank’}

{‘href’: ‘http://game.3533.com/game/‘, ‘target’: ‘_blank’}

{‘href’: ‘http://game.3533.com/tupian/‘, ‘target’: ‘_blank’}

{‘href’: ‘http://www.4399.com/‘, ‘target’: ‘_blank’}

{‘href’: ‘http://www.91wan.com/‘, ‘target’: ‘_blank’}

如果要获取标签a之间的内容,就可以用print href.text输出

六、总结

上面的内容大多都是抄自网上的一些资料。这里只是做了一个大概的总结,后面如果有漏的还会补充。

python学习之xpath使用案例总结_xPath 用法总结整理相关推荐

  1. Python学习:关键字global和nonlocal的用法说明

    一.global global关键字用来在函数或其他局部作用域中使用全局变量. 1.1 如果局部要对全局变量修改,而不使用global关键字. count = 0 def global_test(): ...

  2. Python学习笔记:with open() as f 用法

    file对象的属性: file.read([size])   将文件数据作为字符串返回,可选参数size控制读取的字节数 file.readlines([size])   返回文件中行内容的列表,si ...

  3. [python学习笔记]loc与iloc函数的用法及区别

    loc(location)为Selection by Label函数,即通过标签(行列索引的具体值)来索引数据,由于loc函数中索引的标签是str类型,所以标签的开头和结尾都要写. import pa ...

  4. python count函数用法 comm_Python学习第六天课后练习案例 (主要针对的内容是python函数的定义和使用)...

    Python学习第六天课后练习案例 2019.07.19 1.定义一个函数,该函数可以实现在内部输入一个信息,如果该信息不能转换为正整数,则重新输入,直到能转换为正整数,则对外返回转换的正整数 程序代 ...

  5. Python学习教程(Python学习路线):Python面试100题(二)

    Python学习教程(Python学习路线):面试题接着给大家整理! 16.<div class="nam">中国</div>,用正则匹配出标签里面的内容( ...

  6. 2个Python学习网站制作教程

    最近次条总结了一些2个Python学习网站制作教程的一些核心技术,这里整理了下一些目录,分别是两个网站,大部分技术都在前端,熟悉前端的话直接可以查看网页源码对应去了解学习,这些教程重在理解思路,思路通 ...

  7. Python学习的第十三天:第二周总结

    文章目录 Python学习的第十三天 random 列表 列表的初步了解 列表的构建 列表的相关运算 列表的操作方法 元组 元组的初步了解 元组的构建 元组的相关运算 元组的应用场景 字符串 字符串的 ...

  8. python中xpath使用案例_python爬虫学习笔记:XPath语法和使用示例

    python爬虫:XPath语法和使用示例 XPath(XML Path Language)是一门在XML文档中查找信息的语言,可以用来在XML文档中对元素和属性进行遍历. 选取节点 XPath使用路 ...

  9. TF学习:Tensorflow基础案例、经典案例集合——基于python编程代码的实现

    TF学习:Tensorflow基础案例.经典案例集合--基于python编程代码的实现 目录 Tensorflow的使用入门 1.TF:使用Tensorflow输出一句话 2.TF实现加法 3.TF实 ...

最新文章

  1. pppoe设计的一般性
  2. linux 命令博客,Linux 命令
  3. 6. Qt 信号与信号槽 (5)-QObjectPrivate
  4. oracle易忘函数用法(4)
  5. JS原生封装动画函数
  6. Diango博客--17.统计各个分类和标签下的文章数
  7. Google 资深软件工程师 LeetCode 刷题笔记首次公开
  8. xftp如何搜索文件_头条搜索站长平台如何添加网站和sitemap文件?附图文教程
  9. pandas series取值_【小学生级】pandas入门到精通备查表——AI未来系列3
  10. 阿尔伯塔大学2019计算机科学 cs,[阿尔伯塔大学]计算机/计算机工程专业
  11. Font Configuration and Customization for Open Source Systems - 白皮书翻译和深入
  12. java swing预览pdf_java – 如何使用iText将Swing组件绘制为PDF文件?
  13. C++设计模式之Proxy模式(代理模式)
  14. Oracle记录表删除操作简单方法
  15. 2021-2027全球与中国弹簧加载探针市场现状及未来发展趋势
  16. msfvenom 生成php木马,利用msfvenom生成木马程序
  17. WinodwsServer账户登录密码永不过期
  18. [SDOI2015]寻宝游戏
  19. 酷比魔方iwork1x i30双系统版,重装单Ubuntu 20.04系统记录(重力传感器、触摸屏、启动菜单、声卡问题、优化充电慢)
  20. 系统学习深度学习(四) --CNN原理,推导及实现源码分析

热门文章

  1. 【学习笔记】AR码(二维码)识别
  2. 【ASPICE】ASPICE中的变更管理-Change Management
  3. PLC、运动控制卡、运动控制器,你分的清吗?
  4. 软件测试之Android单元测试
  5. python编程求平均值_Python编程求平均值的两种方法是?
  6. 黑客帝国中代码雨如何实现?用 canvas 轻松实现代码雨炫酷效果!
  7. 解决电脑连上蓝牙时音量过大问题。
  8. python自动化面试常问问题_Python自动化测试常见面试题及解析答案
  9. 【Vim】IdeaVim高级玩法之EasyMotion插件
  10. odl自开发插件编译集成到发行版(opendaylight学习笔记二)