在前面的内容中,我们掌握了一些 CSS 选择器和它们的使用方法,以及 rvest 包中
用于提取网页内容的函数。
一般来说,CSS 选择器足够满足绝大部分
的 HTML 节点匹配的需要。但是,当需要根据某些
特殊条件选择节点时,需要用更强大的技术。
图 14-5 所示的网页比 data/products.html 复杂
一点:
这个网页作为一个独立的 HTML 文件被存储
在 data/new-products.html。全部的源代码很长,这
里只展示 <body> 部分。请浏览一遍源代码,以便
对它的结构有个印象:
<body>
<h1>New Products</h1>

图 14-5
<p>The following is a list of products</p>
<div id = "list" class = "product-list">
<ul>
<li>
<span class = "name">Product-A</span>
<span class = "price">$199.95</span>
<div class = "info bordered">
<p>Description for Product-A</p>
<ul>
<li><span class = "info-key">Quality</span> <span class =
"infovalue">Good</span></li>
<li><span class = "info-key">Duration</span> <span class =
"infovalue">5 </span><span class = "unit">years</span></li>
</ul>
</div>
</li>
<li class = "selected">
<span class = "name">Product-B</span>
<span class = "price">$129.95</span>
<div class = "info">
<p>Description for Product-B</p>
<ul>
<li><span class = "info-key">Quality</span> <span class = "infovalue">
Medium</span></li>
<li><span class = "info-key">Duration</span> <span class = "infovalue">
2</span><span class = "unit">years</span></li>
</ul>
</div>
</li>
<li>
<span class = "name">Product-C</span>
<span class = "price">$99.95</span>
<div class = "info">
<p>Description for Product-C</p>
<ul>
<li><span class = "info-key">Quality</span> <span class = "infovalue">
Good</span></li>
<li><span class = "info-key">Duration</span> <span class = "infovalue">
4</span><span class = "unit">years</span></li>
</ul>
</div>
</li>
</ul>
</div>
<p>All products are available for sale!</p>
</body>
网页的源代码包含了一个样式表和产品详细信息的列表。每个产品都有其描述和很多
性质。接下来,就像前面的例子一样,我们载入网页:
page <- read_ _html("data/new-products.html")
HTML 的代码结构简单明晰。在深入挖掘 XPath 之前,我们需要了解一下 XML。编写
良好且组织规范的 HTML 文档可以被看作 XML(eXtensive Markup Language)文档的一个
特例。与 HTML 不同,XML 允许任意的标签和属性。下面是一个简单的 XML 文档示例:
<?xml version = "1.0"?>
<root>
<product id = "1">
<name>Product-A<name>
<price>$199.95</price>
</product>
<product id = "2">
<name>Product-B</name>
<price>$129.95</price>
</product>
</root>
XPath 专门用于提取 XML 文档中的数据。在本节中,我们比较 XPath 表达式和 CSS 选
择器,查看二者在提取网页数据过程中的作用。
函数 html_node( ) 和 html_nodes( ) 支持 XPath 表达式,并通过参数 xpath= 实
现。表 14-2 展示了 CSS 选择器和等价的 XPath 表达式之间的一些重要对比。
表 14-2
CSS XPath Math
li > * //li/* All children of <li>
li[attr] //li[@attr] All <li> with attr attribute
li[attr=value] //li[@attr = 'value'] <li attr = "value">
li#item //li[@id = 'item'] <li id = "item">
li.info //li[contains(@class,'info')] <li class = "info">
续表
CSS XPath Math
li:first-child //li[1] First <li>
li:last-child //li[last()] Last <li>
li:nth-child(n) //li[n] n th <li>
(N/A) //p[a] All <p> with a child <a>
(N/A) //p[position() <= 5] The first five <p> nodes
(N/A) //p[last()-2] The last third last <p>
(N/A) //li[value>0.5] All <li> with child <value>whose value > 0.5
CSS 选择器会匹配所有子层级的节点。在 XPath 表达式中,标签 // 和 / 匹配不同的
节点。更具体地说,// 标签引用所有子层级的 <tag> 节点,而 / 标签只引用第 1 个子层级
的 <tag> 节点。
我们通过下面这些例子展示它们的用法:
选择所有 <p> 节点:
page %>% html_ _nodes(xpath = "//p")
## {xml_nodeset (5)}
## [1] <p>The following is a list of products</p>
## [2] <p>Description for Product-A</p>
## [3] <p>Description for Product-B</p>
## [4] <p>Description for Product-C</p>
## [5] <p>All products are available for sale!</p>
选择所有具有 class 属性的 <li> 节点:
page %>% html_ _nodes(xpath = "//li[@class]")
## {xml_nodeset (1)}
## [1] <li class = "selected">\n <span class = "name">Pro ...
选择 <div id = "list"><ul> 节点中所有 <li> 子节点:
page %>% html_ _nodes(xpath = "//div[@id = 'list']/ul/li")
## {xml_nodeset (3)}
## [1] <li>\n <span class = "name">Product-A</span>\n ...
## [2] <li class = "selected">\n <span class = "name">Pro ...
## [3] <li>\n <span class = "name">Product-C</span>\n ...
选择所有嵌套于<div id = "list"> 中 <li> 标签下的 <span class = "name"> 子
节点:
page %>% html_ _nodes(xpath = "//div[@id = 'list']//li/span[@class = 'name']")
## {xml_nodeset (3)}
## [1] <span class = "name">Product-A</span>
## [2] <span class = "name">Product-B</span>
## [3] <span class = "name">Product-C</span>
选择所有嵌套于 <li class = "selected"> 中的 <span class = "name"> 子节点:
page %>%
html_ _nodes(xpath = "//li[@class = 'selected']/span[@class = 'name']")
## {xml_nodeset (1)}
## [1] <span class = "name">Product-B</span>
上面这些例子也可以使用等效的 CSS 选择器来实现。然而,下面这些例子就不能
用 CSS 选择器实现了:
选择所有包含 <p> 子节点的 <div> 节点:
page %>% html_ _nodes(xpath = "//div[p]")
## {xml_nodeset (3)}
## [1] <div class = "info bordered">\n <p>Description ...
## [2] <div class = "info">\n <p>Description for Prod ...
## [3] <div class = "info">\n <p>Description for Prod ...
选择所有的 <span class = "info-value">Good</span>:
page %>%
html_ _nodes(xpath = "//span[@class = 'info-value' and text() = 'Good']")
## {xml_nodeset (2)}
## [1] <span class = "info-value">Good</span>
## [2] <span class = "info-value">Good</span>
选择所有优质产品的名称:
page %>%
html_ _nodes(xpath = "//li[div/ul/li[1]/span[@class = 'info-value' and
text() = 'Good']]/span[@class = 'name']")
## {xml_nodeset (2)}
## [1] <span class = "name">Product-A</span>
## [2] <span class = "name">Product-C</span>
选择所有持续时间超过 3 年的产品名称:
page %>%
html_ _nodes(xpath = "//li[div/ul/li[2]/span[@class = 'info-value' and
text()>3]]/span[@class = 'name']")
## {xml_nodeset (2)}
## [1] <span class = "name">Product-A</span>
## [2] <span class = "name">Product-C</span>
XPath 是非常灵活的,在匹配网页节点方面是一个强大的工具。想要了解更多内容,
请访问 http://www.w3schools.com/xsl/xpath_syntax.aspac。

使用 XPath 选择器的更多相关文章

  1. Python爬虫与数据分析之爬虫技能:urlib库、xpath选择器、正则表达式

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  2. 使用scrapy中xpath选择器的一个坑点

    情景如下: 一个网页下有一个ul,这个ur下有125个li标签,每个li标签下有我们想要的 url 字段(每个 url 是唯一的)和 price 字段,我们现在要访问每个li下的url并在生成的请求中 ...

  3. 常用xpath选择器和css选择器总结

    xpath选择器 表达式 说明 article 选取所有article元素的所有子节点 /article 选取根元素article article/a 选取所有属于article的子元素的a元素 // ...

  4. xpath选择器简介及如何使用

    xpath选择器简介及如何使用 一.总结 一句话总结:XPath 的全称是 XML Path Language,即 XML 路径语言,它是一种在结构化文档(比如 XML 和 HTML 文档)中定位信息 ...

  5. 在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)

    前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建s ...

  6. Selenium(九):Xpath选择器

    1. Xpath选择器 1.1 Xpath语法简介 前面我们学习了CSS选择元素. 大家可以发现非常灵活.强大. 还有一种灵活.强大的选择元素的方式,就是使用Xpath表达式. XPath (XML ...

  7. 用Xpath选择器解析网页(lxml)

    在<爬虫基础以及一个简单的实例>一文中,我们使用了正则表达式来解析爬取的网页.但是正则表达式有些繁琐,使用起来不是那么方便.这次我们试一下用Xpath选择器来解析网页. 首先,什么是XPa ...

  8. xpath选择器使用

    简单说,xpath就是选择XML文件中节点的方法. 所谓节点(node),就是XML文件的最小构成单位,一共分成7种. - element(元素节点)- attribute(属性节点)- text ( ...

  9. 初始scrapy,简单项目创建和CSS选择器,xpath选择器(1)

    一 安装 #Linux: pip3 install scrapy #Windows: a. pip3 install wheel b. 下载twisted http://www.lfd.uci.edu ...

随机推荐

  1. 部署 Flask 应用时,为什么会需要 gunicorn 或 uWSGI?

    Flask自带的wsgi性能低下 只适合你开发调试的时候用, 线上你必须用Gunicorn+Nginx才能获得更强的性能,和更高的安全性

  2. 接口自动化测试框架搭建 – Java+TestNG 测试Restful service

    接口自动化测试 – Java+TestNG 测试 Restful Web Service 关键词:基于Rest的Web服务,接口自动化测试,数据驱动测试,测试Restful Web Service, ...

  3. transition和animation区别

    Transform:对元素进行变形: Transition:对元素某个属性或多个属性的变化,进行控制(时间等),类似flash的补间动画.但只有两个关键贞.开始,结束. Animation:对元素某个 ...

  4. 【转】Java学习:Java中的线程之线程间的通信

    hello各位小伙伴 今天我们来搞一下 线程之间的通信 ( • ̀ω•́ )✧ 让线程按照我们的想法来执行 两个线程间的通信 这是我们之前的线程. 执行效果:谁抢到资源,谁运行~ 实现线程交替执行: ...

  5. linux常用命令:at 命令

    在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...

  6. Unity VR编辑器――如上帝般创建VR内容,Project Soli google用雷达识别手势体积相当于一张 Mini SD 内存卡

    Unity VR编辑器――如上帝般创建VR内容在GDC的一个活动中,Unity首席设计师Timoni West展示了最新的Unity VR编辑器的原型系统,让你如上帝般创建VR应用,从一片空白场景开始 ...

  7. python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法

    python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...

  8. [转载] iframe嵌入网页的用法

    iframe并不是很常用的,在标准的网页中非常少用.但是有朋友经常问到,下面我简单地介绍一下它的用法,你只要熟练掌握这些参数足矣. <iframe>也应该是框架的一种形式,它与<fr ...

  9. ELK学习笔记之CentOS 7下ELK(6.2.4)++LogStash+Filebeat+Log4j日志集成环境搭建

    0x00 简介 现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的. 经 ...

  10. [算法整理]树上求LCA算法合集

    1#树上倍增 以前写的博客:http://www.cnblogs.com/yyf0309/p/5972701.html 预处理时间复杂度O(nlog2n),查询O(log2n),也不算难写. 2#st ...