专栏首页GopherCoderxpath 和 pyquery

xpath 和 pyquery

主题:

**xpath 和 pyquery **

xpath

  • 选取节点

表达式

描述

实例

介绍

nodename

选取nodename节点的所有子节点

xpath("//div")

/

从根节点选取

xpath('/div')

//

选取所有的当前节点,不考虑位置

xpath("//div")

.

选取当前节点

xpath(‘./div’)

选取当前节点下的div节点

..

选取当前节点的父节点

xpath(‘..’)

回到上一个节点

@

选取属性

xpath(’//@calss’)

选取所有的class属性

  • 谓语

表达式

结果

xpath(‘/body/div[1]’)

选取body下的第一个div节点

xpath(‘/body/div[last()]’)

选取body下最后一个div节点

xpath(‘/body/div[last()-1]’)

选取body下倒数第二个div节点

xpath(‘/body/div[positon()<3]’)

选取body下前两个div节点

xpath(‘/body/div[@class]’)

选取body下带有class属性的div节点

xpath(‘/body/div[@class=”main”]’)

选取body下class属性为main的div节点

xpath(‘/body/div[price>35.00]’)

选取body下price元素值大于35的div节点

  • 通配符

表达式

结果

xpath(’/div/*’)

选取div下的所有子节点

xpath(‘/div[@*]’)

选取所有带属性的div节点

  • 取多个路径

表达式

结果

xpath(‘//div|//table’)

选取所有的div和table节点

  • xpath轴

轴名称

表达式

描述

ancestor

xpath(‘./ancestor::*’)

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

ancestor-or-self

xpath(‘./ancestor-or-self::*’)

选取当前节点的所有先辈节点以及节点本身

attribute

xpath(‘./attribute::*’)

选取当前节点的所有属性

child

xpath(‘./child::*’)

返回当前节点的所有子节点

descendant

xpath(‘./descendant::*’)

返回当前节点的所有后代节点(子节点、孙节点)

following

xpath(‘./following::*’)

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

following-sibing

xpath(‘./following-sibing::*’)

选取当前节点之后的兄弟节点

parent

xpath(‘./parent::*’)

选取当前节点的父节点

preceding

xpath(‘./preceding::*’)

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

preceding-sibling

xpath(‘./preceding-sibling::*’)

选取当前节点之前的兄弟节点

self

xpath(‘./self::*’)

选取当前节点

  • 功能函数

1.png

使用xpath中,多结合功能函数和谓语的使用可以减少提取信息的难度

  • 总结
  1. 节点的遍历
  2. 属性的提取
  3. 文本的提取

pyquery

可以让你用jquery语法来对xml进行查询

  • 基本概念

2.png

1484385342126.png

  • 提取:Fiserv Inc
doc = PyQuery(html)
使用id标签
doc("#instrumentname").text()

'Fiserv Inc.'
  • 提取:NASDAQ: FISV
使用id标签
doc("#instrumentticker").text()
'NASDAQ: FISV'

使用class 标签
doc(".textdeemphasized").text()
'NASDAQ: FISV'

使用tagname 
doc("p").eq(0).text() # p元素包含很多个,eq(0)表示是第一个p元素
'NASDAQ: FISV'
  • 提取p元素
all_tag_p = doc("p").items()

for one in all_tag_p:
    print (one.text())

NASDAQ: FISV
Set Alerts
Find a Broker
Join TD Ameritrade
Market Index
After Hours
-- Quotes are delayed by 20 min
Jan 13, 2017, 4:44 p.m.
$
110.30

Change
0.00 0.00%
Volume
Volume 31,006
Quotes are delayed by 20 min
Previous close
...
  • 提取属性值attr
p_id = doc("p").attr("id")

'instrumentticker'

p_class = doc("p").attr("class")

'textdeemphasized'
  • 总结
  1. 获取标签值:tag
  2. 获取属性:#, .
  3. 获取文本:text()

做的绝大多数爬行就是对标签、属性、文本等的获取,关键是选择较好的适合自己的方法,当然各种方法的选择效率也不一样。我比较属性的是xpath, 然而当我接触到pyquery看下文档就差不多也能获取到自己需要的网页内容,接下来关键是熟悉的过程。

参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 专栏:011:Elasticsearch 的使用

    谢伟
  • 『沉浸式Github 使用指南 』

    谢伟
  • Python: 一周笔记

    谢伟
  • 作为程序员,难道你心里没点“B树”?

    顺序存储的特点是各个存储单位在逻辑和物理内存上都是相邻的,典型的就是代表就是数组,物理地址相邻因此我们可以通过下标很快的检索出一个元素

    xcbeyond
  • 详解 React 16 的 Diff 策略

    我相信在看这篇文章的读者一般都已经了解过 React 16 以前的 Diff 算法了,这个算法也算是 React 跨时代或者说最有影响力的一点了,使 React...

    桃翁
  • 详解 React 16 的 Diff 策略

    这是我 Deep In React 系列的第二篇文章,如果还没有读过的强烈建议你先读第一篇:详谈 React Fiber 架构(1)。

    Nealyang
  • 详解 React 16 的 Diff 策略

    这是我 Deep In React 系列的第二篇文章,如果还没有读过的强烈建议你先读第一篇:详谈 React Fiber 架构(1)。

    胡哥有话说
  • EF基础知识小记六(使用Code First建模自引用关系,常用于系统菜单、文件目录等有层级之分的实体)

    日常开发中,经常会碰到一些自引用的实体,比如系统菜单、目录实体,这类实体往往自己引用自己,所以我们必须学会使用Code First来建立这一类的模型. 以下是自...

    郑小超.
  • switch...case与if...else执行能力分析

    switch...case与if...else作为条件判断语句在程序中用的是非常多的。

    踏浪
  • Elasticsearch 6.6 官方文档 之「节点」

    每次启动 Elasticsearch 实例时,都会启动一个节点。连接节点的集合称之为「集群」。如果你运行的是单个 Elasticsearch 节点,那么你也就拥...

    CG国斌

扫码关注云+社区

领取腾讯云代金券