r - 如何用 rvest 过滤掉节点?
问题描述
我正在使用 R rvest 库来读取包含表格的 html 页面。不幸的是,这些表的列数不一致。
这是我阅读的表格的示例:
<table>
<tr class="alt">
<td>1</td>
<td>2</td>
<td class="hidden">3</td>
</tr>
<tr class="tr0 close notule">
<td colspan="9">4</td>
</tr>
</table>
和我在 R 中读取表格的代码:
require(rvest)
url = "table.html"
x <- read_html(url)
(x %>% html_nodes("table")) %>% html_table(fill=T)
# [[1]]
# X1 X2 X3 X4 X5 X6 X7 X8 X9
# 1 1 2 3 NA NA NA NA NA NA
# 2 4 4 4 4 4 4 4 4 4
我想避免考虑隐藏类的 td 和类 'tr0 close notule' 的 tr,所以我只得到一个如下表:
X1 X2
1 2
有没有办法用 rvest 做到这一点?
解决方案
通过使用xml_remove()
,您可以从字面上删除这些节点
text <- '<table>
<tr class="alt">
<td>1</td>
<td>2</td>
<td class="hidden">3</td>
</tr>
<tr class="tr0 close notule">
<td colspan="9">4</td>
</tr>
</table>'
html_tree <- read_html(text)
#select nodes you want to remove
hidden_nodes <- html_tree %>%
html_nodes(".hidden")
close_nodes <- html_tree %>%
html_nodes(".tr0.close.notule")
#remove those nodes
xml_remove(hidden_nodes)
xml_remove(close_nodes)
html_tree %>%
html_table()
我检查了 css,发现这些节点的 css 是这样的:tr0 close notule
, tr1 close notule
,..., tr{n} close notule
,所以你需要更通用来选择所有这些节点
编辑代码使其适用于真实网站:
library(purrr)
library(rvest)
my_session <- html_session("https://www.zone-turf.fr/cheval/greaty-lion-592958/")
#select all table nodes
tables <- my_session %>%
html_nodes(".inner2 > table")
# remove nodes with class of "close and notule"
close_nodes <- tables %>%
html_nodes(".close.notule")
xml_remove(close_nodes)
#use map to create all tables and store them in a list.
map(tables,~ .x %>% html_table())
在调整要删除的节点的 css 选择器后,它应该可以工作:
#sample output --------------
[[8]]
RangRg Cheval S/A CordeC PoidsPds Jockey Cote Ecart
1 1 Latita F2 3 57,5 T. Piccone 6.3 1'56"05 NA
2 2 Youmzain Star M2 6 59 F. Veron 4.7 3/4 NA
3 3 Pharrell M2 1 59 J.B. Eyquem 1.9 1 NA
4 4 King Bubble M2 4 58 N. Perret 15.5 1 NA
5 5 Dark Side M2 5 57 A. Hamelin 12.4 8 NA
6 6 Greaty Lion F2 2 57,5 F. Blondel 6.8 15 NA
[[9]]
RangRg Cheval S/A CordeC PoidsPds Jockey Cote Ecart
1 1 Marianafoot M2 4 59 N. Perret 2.1 1'40"25 lire
2 2 Ballet de la Reine F2 2 54 H. Journiac 3.4 1 1/2
3 3 Greaty Lion F2 5 57,5 F. Blondel 7.0 2
4 4 Beau Massagot M2 6 54 E. Cieslik 9.7 5
5 5 London Look M2 3 58 T. Piccone 8.8 5,5
6 6 Spirit Louve F2 1 53 L. Grosso 18.8 Tête
[[10]]
RangRg Cheval S/A CordeC PoidsPds Jockey Cote Ecart
1 1 Greaty Lion F2 12 58 F. Blondel 3.6 1'43"84 NA
2 2 Maeghan F2 11 58 G. Millet 5.1 1 NA
3 3 Neige Eternelle F2 8 58 A. Roussel 3.8 1 3/4 NA
4 4 Fair la Joie F2 9 58 G. Congiu 11.6 1/4 NA
5 5 Nicky Green F2 7 58 R. Thomas 6.4 1/4 NA
6 6 Coral Slipper F2 5 58 A. Fouassier 28.4 1 1/4 NA
7 7 Gaia de Cerisy F2 13 58 D. Breux 32.5 1 NA
8 8 Luna Riska F2 1 58 N. Larenaudie 58.3 Encolure NA
9 9 Belle Vendome F2 2 56 A. Teissieux 49.9 2 1/2 NA
10 0 Rebel Dream F2 3 58 S. Leger 56.6 NA
11 0 Facinateur F2 4 56 M. Berto 21.2 NA
12 0 Giovanna F2 10 56 F. Garnier 27.8 NA
推荐阅读
- java - JavaFX Webview:滚动条重叠内容
- ios - Firebase 存储:发生未知错误,请检查服务器响应
- json - 我尝试使用颤振和json数据从rest api向DropDownButton显示数据,但它没有用
- swift - Catalyst App 中的 UserDefaults 错误,推荐的解决方案不起作用
- vb.net - 单击面板时移动表单vb.net
- html - 如何在 HTML/CSS 中创建具有半透明背景的导航栏
- python - df.city.unique() 返回与 groupby(['city']) 不同的名称顺序
- html - 尝试对我的下拉菜单使用 bootstrap-select
- angular - 可以将属性传递给 Angular 中的元数据动画
- json - 在 Python 中使用(JSON 或 YAML)生成的数据值