在R中抓取本地HTML转会数据:如何将选择器索引设为变量?
解决R中批量抓取转会数据的CSS选择器索引问题
我明白你遇到的问题了——固定的:nth-child(2)索引只能抓取单条转会数据,没法遍历所有的转会条目。其实核心思路是先定位所有转会的父节点,再从每个父节点内部提取需要的信息,这样就不用依赖外部的固定索引了。
分析HTML结构
从你提供的HTML片段可以看到,每一条转会记录都被包裹在<li class="post pressRelease">标签里,里面的<ul class="player">包含了所有我们需要的信息:球员姓名、时间、转会费,还有<div class="from">里的卖家和买家。
修改后的R代码
我们可以用purrr包的map_dfr来遍历每个转会条目,把每条数据整合成一个数据框:
library(rvest) library(purrr) library(dplyr) # 读取本地HTML文件 dades <- read_html("你的本地HTML文件路径.html") # 获取所有转会条目 transfer_items <- dades %>% html_nodes("li.post.pressRelease") # 遍历每个条目,提取数据 transfer_data <- transfer_items %>% map_dfr(function(item) { # 提取球员姓名 player <- item %>% html_node("ul.player li.text strong") %>% html_text() %>% trimws() # 提取转会费 cost <- item %>% html_node("ul.player li.text span") %>% html_text() %>% trimws() # 提取卖家和买家:div.from里的两个strong标签,第一个是卖家,第二个是买家 from_to <- item %>% html_nodes("ul.player li.text div.from strong") %>% html_text() %>% trimws() seller <- from_to[1] buyer <- from_to[2] # 提取交易时间 day <- item %>% html_node("ul.player li.text time") %>% html_text() %>% trimws() # 返回当前条目的数据框 tibble(player, cost, seller, buyer, day) }) # 查看结果 print(transfer_data)
代码说明
- 先抓所有转会父节点:
html_nodes("li.post.pressRelease")会把页面上所有的转会条目都抓下来,不管有多少条。 - 从父节点内部提取元素:每个
item就是一条转会记录,我们从item内部用相对的CSS选择器找子元素,比如ul.player li.text strong,这样就不用依赖外部的#pressReleases > ul > li:nth-child(2)这种固定索引了。 - 卖家和买家的提取:
div.from里的两个<strong>标签正好对应卖家和买家,所以我们把它们都抓下来后,分别取第1和第2个元素即可。
这样修改后,不管页面上有多少条转会记录,都能一次性批量抓取所有数据啦。
内容的提问来源于stack exchange,提问作者xuriguer
相关产品推荐
相关产品推荐

