使用R与rvest将HTML转换为data.frame的简易方法求助
解决方案
这个页面的内容是在<pre>标签里的纯文本排版,并非标准结构化表格,直接用rvest::html_nodes()提取节点拿不到日期和大小字段,得先提取<pre>内的完整文本再做字符串处理,具体步骤如下:
- 加载所需R包:
library(rvest) library(stringr) library(dplyr)
- 读取HTML内容并提取
<pre>标签里的文本:
# 替换成你的HTML内容或目标网页URL html_content <- '<pre> <a href="?C=N;O=D">Name</a> <a href="?C=M;O=A">Last modified</a> <a href="?C=S;O=A">Size</a> <hr> <a href="/src/contrib/Archive/">Parent Directory</a> - <a href="dplyr_0.8.0.tar.gz">dplyr_0.8.0.tar.gz</a> 2019-02-14 22:22 1.1M <a href="dplyr_0.8.1.tar.gz">dplyr_0.8.1.tar.gz</a> 2019-05-14 12:20 1.1M <a href="dplyr_0.8.2.tar.gz">dplyr_0.8.2.tar.gz</a> 2019-06-29 04:50 1.1M <a href="dplyr_0.8.3.tar.gz">dplyr_0.8.3.tar.gz</a> 2019-07-04 15:50 1.1M <a href="dplyr_0.8.4.tar.gz">dplyr_0.8.4.tar.gz</a> 2020-01-31 17:20 1.1M <a href="dplyr_0.8.5.tar.gz">dplyr_0.8.5.tar.gz</a> 2020-03-07 12:20 1.3M <a href="dplyr_1.0.0.tar.gz">dplyr_1.0.0.tar.gz</a> 2020-05-29 15:00 817K <hr></pre>' pre_text <- read_html(html_content) %>% html_node("pre") %>% html_text()
- 清理文本并过滤有效行:
# 按换行拆分文本,去掉每行首尾空格 lines <- str_split(pre_text, "\\n")[[1]] %>% trimws() # 过滤掉空行、表头行、Parent Directory行和含<hr>的无效行 valid_lines <- lines[lines != "" & !str_detect(lines, "^Name|Parent Directory|<hr>")]
- 拆分字段并转换为data.frame:
# 以两个及以上空格为分隔符拆分每行内容 data_matrix <- str_split(valid_lines, "\\s{2,}", simplify = TRUE) # 转为数据框并设置列名 df <- as.data.frame(data_matrix, stringsAsFactors = FALSE) %>% setNames(c("Name", "Datetime", "Size"))
执行完上述代码后,df就是包含名称、日期时间和大小字段的目标data.frame。
内容的提问来源于stack exchange,提问作者sveer
相关产品推荐
相关产品推荐

