使用 CSS 选择器从网页中提取数据
在 R 中,关于网络爬虫最简单易用的扩展包是 rvest。运行以下代码从 CRAN 上安装:
install.packages("rvest")
首先,加载包并用 read_html( ) 读取 data/single-table.html,再尝试从网页中提取表格:
library(rvest)
## Loading required package: xml2
single_table_page <- read_ _html("data/single-table.html")
single_table_page
## {xml_document}
## <html>
## [1] <head>\n <title>Single table</title>\n</head>
## [2] <body>\n <p>The following is a table</p>\n <table i ...
注意到,single_table_page 是一个HTML 解析文档,是HTML 节点的嵌套数据结构。
使用 rvest 函数从网页上爬取信息的典型过程是这样的。首先,定位需要从中提取数
据的 HTML 节点。然后,使用 CSS 选择器或者 XPath 表达式筛选 HTML 节点,从而选择
需要的节点,剔除不需要的节点。最后,对已解析的网页使用合适的选择器,用 html_
nodes( ) 提取节点子集,用 html_attrs( ) 提取属性,用 html_text( ) 提取文本。
rvest 包也提供了一些简单的函数,从网页中直接提取数据并返回一个数据框。例如,
提取网页中所有的 <table> 元素,我们直接调用 html_table( ):
html_ _table(single_table_page)
## [[1]]
## Name Age
## 1 Jenny 18
## 2 James 19
为了提取<table> 中的第 1 个元素,我们在使用 CSS 选择器 table 的时候,调用
html_node( ) 选择第1个节点,再对选择出来的节点调用 html_table( ) 得到一个数据框:
html_ _table(html_ _node(single_table_page, "table"))
## Name Age
## 1 Jenny 18
## 2 James 19
一个很自然的想法便是使用管道操作,就像第 12 章中介绍的 dplyr 包中使用 %>% 管
道操作符。回顾一下,%>% 执行 x %>% f(···) 的基本方法就是 f(x,···),因此,嵌
套调用可以被拆解,从而提高可读性。上述代码可以用 %>% 重写为:
single_table_page %>%
html_ _node("table") %>%
html_ _table()
## Name Age
## 1 Jenny 18
## 2 James 19
现在,读取 data/products.html,并用 html_nodes( ) 匹配 <span class = "name"> 节点:
products_page <- read_ _html("data/products.html")
products_page %>%
html_ _nodes(".product-list li .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>
注意到,我们想选择的节点是 product-list 类的 <li> 标签下属于 name 类的节
点。因此,使用.product-list li .name 选择这样的嵌套节点。如果对这些符号不熟
悉,请温习常用的 CSS 表。
之后,再用 html_text( ) 从选择的节点中提取内容,这个函数会返回一个字符向量:
products_page %>%
html_ _nodes(".product-list li .name") %>%
html_ _text()
## [1] "Product-A" "Product-B" "Product-C"
类似地,下面的代码提取出产品价格:
products_page %>%
html_ _nodes(".product-list li .price") %>%
html_ _text()
## [1] "$199.95" "$129.95" "$99.95"
前 面 这 些 代 码 中 , html_nodes( ) 返 回 一 个 包 含 HTML 节 点 的 集 合 ,
而 html_text( ) 则从每个 HTML 节点中智能地提取内部文本,然后返回一个字符向量。
但是,这些价格保留了它们的原生格式,即字符串形式,而不是数字。下面的代码提
取出来相同的数据,并把它转换成更常用的格式:
product_items <- products_page %>%
html_ _nodes(".product-list li")
products <- data.frame(
name = product_items %>%
html_ _nodes(".name") %>%
html_ _text(),
price = product_items %>%
html_ _nodes(".price") %>%
html_ _text() %>%
gsub("$", "", ., fixed = TRUE) %>%
as.numeric(),
stringsAsFactors = FALSE
)
products
## name price
## 1 Product-A 199.95
## 2 Product-B 129.95
## 3 Product-C 99.95
注意到,选择节点的中间结果可以被存储在一个变量中,以便重复使用。后续
的 html_nodes( ) 或 html_node( ) 仅仅匹配内部节点。
既然产品价格是数值,我们便可以用 gsub( ) 从原生价格中移除 $,然后将结果转换
成一个数值向量。管道操作中的 gsub( ) 调用有点特殊,因为前面的结果(用 . 表示)
本该放在第 3 个参数位置,而不是第 1 个。
这个例子中,.product-list li .name 可以缩写为 .name,同理,.product-list
li .price 可以被 .price 代替。在实际应用中,CSS 类被广泛地运用,因此,一个通用
的选择器可能会匹配太多非合意的元素。所以,最好选择一个描述更清晰,限制条件更严
格的选择器去匹配感兴趣的节点。
使用 CSS 选择器从网页中提取数据的更多相关文章
- css注入获取网页中的数据
<style><?php echo htmlspecialchars($_GET['x']);?></style> <br><br>< ...
- 在Scrapy中如何利用Xpath选择器从HTML中提取目标信息(两种方式)
前一阵子我们介绍了如何启动Scrapy项目以及关于Scrapy爬虫的一些小技巧介绍,没来得及上车的小伙伴可以戳这些文章: 手把手教你如何新建scrapy爬虫框架的第一个项目(上) 手把手教你如何新建s ...
- JMETER从JSON响应中提取数据
如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量. 好消息!您正在掌握掌握JMeter Json Extractor的权威指南.作为Rest API测试指南的补充,您将学习掌握J ...
- 如何使用JMETER从JSON响应中提取数据
如果你在这里,可能是因为你需要使用JMeter从Json响应中提取变量. 好消息!您正在掌握掌握JMeter Json Extractor的权威指南.作为Rest API测试指南的补充,您将学习掌握J ...
- 如何使用JMeter从文件中提取数据
在性能测试方面,重用响应数据至关重要.几乎(如果不是全部!)负载测试场景假设您: 从先前的响应中提取有趣的方面,并在下一个请求中重用它们(也称为相关) 确保实际响应符合预期(又称断言) 因此,如果您是 ...
- [数据科学] 从csv, xls文件中提取数据
在python语言中,用丰富的函数库来从文件中提取数据,这篇博客讲解怎么从csv, xls文件中得到想要的数据. 点击下载数据文件http://seanlahman.com/files/databas ...
- 通过CSS让html网页中的内容不可选
*{ moz-user-select: -moz-none; -moz-user-select: none; -o-user-select:none; -khtml-user-select:none; ...
- Web网页中动态数据区域的识别与抽取 Dynamical Data Regions Identification and Extraction in Web Pages
Web网页中动态数据区域的识别与抽取 Dynamical Data Regions Identification and Extraction in Web Pages Web网页中动态数据区域的识别 ...
- 网页中的数据的4个处理方式:CRUD(Creat, Retrive, Update, Delete)
网页中的数据的4个处理方式:CRUD(Creat, Retrive, Update, Delete) 2018-12-21, 后续完善
随机推荐
- jmeter 读取excel数据
jmeter 读取excel数据使用的方法是使用Jmeter CSV Data Set Config参数化 但是将excel文件保存成csv格式后,jmeter读取后返回的数据总是出现乱码问题, 以下 ...
- jxl(Java Excel API) 使用方法 【2】
JAVA EXCEL API简介 Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该 API非Win ...
- 7.12 Models -- Frequently Asked Questions
一.Should I use a query or a filter to seach records?我应该使用一个查询或者过滤器来搜索记录吗? 这取决于你想要搜索多少reocrds并且它们是否被加 ...
- 混合高斯模型(Mixtures of Gaussians)
http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006924.html 这篇讨论使用期望最大化算法(Expectation-Maximizat ...
- 在HTML中实现和使用遮罩层
Web页面中使用遮罩层,可防止重复操作,提示loading:也可以模拟弹出模态窗口. 实现思路:一个DIV作为遮罩层,一个DIV显示loading动态GIF图片.在下面的示例代码中,同时展示了如何在i ...
- Linux服务器配置---ftp用户黑名单
用户黑白名单 一个Linux主机中会多个用户,而我们希望有些用户不能去访问ftp.ftp服务器可以通过配置文件“/etc/vsftpd/user_list”来设置一个用户列表,这个列表可以是黑名单,也 ...
- javashop组件开发指南
javashop组件开发指南 1. 概念解释 组件:可以理解为是插件,功能点的一个集合. 插件:是指具体的某个功能. 插件桩:是负责调用插件. 事件:是要决定什么时候执行插件 一个组件是由多 ...
- MySQL数据库----函数
函数 MySQL中提供了许多内置函数,例如: CHAR_LENGTH(str) 返回值为字符串str 的长度,长度的单位为字符.一个多字节字符算作一个单字符. 对于一个包含五个二字节字符集, LENG ...
- P4289 [HAOI2008]移动玩具(bfs)
P4289 [HAOI2008]移动玩具 双向bfs+状态压缩+记忆化搜索 双向bfs用于对bfs的优化,每次找到可扩展节点少的一边进行一次bfs,找到的第一个互相接触的点即为最短路径 矩阵范围仅4* ...
- Eclipse中把Java工程修改成web工程
Eclipse中把Java工程修改成web工程 点击项目:右击:选择properties--输入project facets,将“Dynamic Web Module”打勾即可: