【问题标题】:How to convert hmtl_node to list in R如何将 hmtl_node 转换为 R 中的列表
【发布时间】:2021-08-19 11:02:18
【问题描述】:

我从网上抓取了一堆数据:

source <- "https://www.ifad.org/en/web/operations/-/project/1100000001" #example data
html_out <- read_html(source)
temp_list <- html_out %>%
    html_node(".project-row")

> temp_list
{html_node}
<div class="m-3 project-row">
 [1] <dd class="project-status mt-3">\r\n                                        <span>Status: Closed</span>\r\n                           ...
 [2] <dt class="project-row-title">Country</dt>
 [3] <dd class="project-row-text">\r\n                                            <a href="/en/web/operations/w/country/dominican-republic ...
 [4] <dt class="project-row-title">Approval Date</dt>
 [5] <dd class="project-row-text">19 December 1979</dd>
 [6] <dt class="project-row-title">Duration</dt>
 [7] <dd class="project-row-text">1979 - 1988</dd>
 [8] <dt class="project-row-title">Sector</dt>
 [9] <dd class="project-row-text">Settlement</dd>
[10] <dt class="project-row-title">\r\nTotal Project Cost                                </dt>

我现在想对这些数据执行一些操作,这可能需要列表格式并且应该返回列表格式。比如下面这些:

temp_list <- temp_list %>%
    gsub("^ *|(?<= ) | *$", "", ., perl = TRUE) %>% # removing multiple spaces
    gsub("\r\n", "", .) # remove \r\n

for (j in 1:length(temp_list)) {
        temp_list[j] <- #do more stuff here
        }

我还不太明白 html_nodes 是如何工作的,但显然不像列表。例如,length(temp_list) 产生 2 而不是 10。 gsub() 命令不返回列表,而是返回一个长字符串。我试过lapply(X = ., FUN = function (t) gsub(pattern = "^ *|(?&lt;= ) | *$", replacement = "", x = t, fixed = TRUE)) 来解决这个问题,但它返回一个错误:cannot coerce type 'externalptr' to vector of type 'character'

如何从 html_node 中创建一个列表或其他可行的格式? Here 建议使用bind_rows(lapply(xml_attrs(temp_list ), function(x) data.frame(as.list(x), stringsAsFactors=FALSE))),但这只会产生m-3 project-row。我也尝试按照建议的here 使用xmlValue(),但没有成功。

所有这些都在我之前的脚本版本中运行,我只是简单地写了(尽管承认不是很优雅):

temp_list <- html_out%>%
    html_nodes(".project-row") %>%
    as_list(.) %>%
    unlist(., use.names= FALSE) %>%
    as.list(.) %>%
    gsub("^ *|(?<= ) | *$", "", ., perl = TRUE) %>% # removing multiple spaces
    gsub("\r\n", "", .) # remove \r\n

由于某种原因,它不再起作用了,即使我不记得对我的这部分代码或输入数据进行了任何更改。

【问题讨论】:

  • 你能分享你从哪里抓取数据的网页的网址吗?
  • 这是这个页面:ifad.org/en/web/operations/-/project/1100000001。我在问题中添加了它。
  • 你想从链接中提取什么?您的预期输出是什么?
  • 最终的预期输出是一个有几列和两行的表格,其中包含该页面的所有数据。例如。批准日期:1979年12月19日;持续时间:1979 - 1988。我已经编写了脚本来做到这一点,并且它之前工作过。我的问题是指如何将 html_node 类型转换为列表(我的预期输出)。我想要一个列表来使用temp_list[j] 从节点中读取数据并应用gsub() 之类的命令,这些命令适用于列表但不适用于html_node。

标签: html r xml


【解决方案1】:

您可以使用html_text 仅从节点中提取文本并在其上应用gsub 代码。

library(rvest)

source <- "https://www.ifad.org/en/web/operations/-/project/1100000001" #example data
html_out <- read_html(source)
temp_list <- html_out %>%
  html_node(".project-row") %>%
  html_text()


temp_list %>%
  gsub("^ *|(?<= ) | *$", "", ., perl = TRUE) %>% 
  gsub("[\r\n]", "", .)

【讨论】:

  • 问题是这会返回一个字符串中连接在一起的所有元素。那么我将如何区分一种元素和另一种元素呢?我想使用temp_list[1] 之类的东西来接收Status: Closedtemp_list[2] 来接收Country 等等来构建我的表。
【解决方案2】:

我搜索的函数是html_children()

脚本现在如下所示:

temp_list <- html_out %>%
    html_node(".project-row") %>% 
    html_children %>% 
    html_text() %>%
    gsub("\r\n", "", .) %>% # remove \r\n
    gsub("^ *|(?<= ) | *$", "", ., perl = TRUE) # removing multiple spaces

应用html_childrentemp_listxml_node 类的对象转换为xml_nodesetxml_nodeset 可以像列表一样使用,例如通过temp_list[j] 寻址单个元素。然后在xml_nodeset 上应用html_text 会保留类似列表的结构,并且不会将元素连接在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 2020-07-29
    • 1970-01-01
    相关资源
    最近更新 更多