【问题标题】:Error subsetting data.frame from xml2 and rvest从 xml2 和 rvest 子集 data.frame 出错
【发布时间】:2020-07-28 03:14:41
【问题描述】:

我正在从维基百科抓取数据并将其放入 data.frame。但是,我无法子集生成的 data.frame。

如果我使用 dput 将数据重新加载到另一个变量中,则子集可以正常工作。我不清楚我是否做错了什么,或者 R 或我正在使用的某个软件包中是否存在错误。这是一个可重现的例子。

第一步:将数据加载到reps

library(rvest)
library(xml2)
url    = "https://en.m.wikipedia.org/wiki/List_of_current_members_of_the_United_States_House_of_Representatives"
file   = xml2::read_html(url)
tables = rvest::html_nodes(file, "table")

reps = rvest::html_table(tables[6])
reps = as.data.frame(reps)[1,1:3]

reps$District
# [1] "Alabama 1"

# I expected this line to return TRUE
reps$District == "Alabama 1"
# [1] FALSE

# Because the above line returns FALSE, this code returns an empty data.frame
reps[reps$District=="Alabama 1",]
# [1] District Member   Party   
# <0 rows> (or 0-length row.names)

特别奇怪的是,如果我使用 dput 写入和重新加载数据,子集工作正常:

dput(reps)
# structure(list(District = "Alabama 1", Member = "Bradley Byrne", 
#    Party = NA), row.names = 1L, class = "data.frame")

x=structure(list(District = "Alabama 1", Member = "Bradley Byrne", 
                 Party = NA), row.names = 1L, class = "data.frame")

# now it's TRUE!
x$District=="Alabama 1"
# [1] TRUE

# and so the subset works
x[x$District == "Alabama 1", ]
# District        Member Party
# 1 Alabama 1 Bradley Byrne    NA

我相信我正在使用最新版本的 R 和所有软件包:

> sessionInfo()
R version 4.0.2 (2020-06-22)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Catalina 10.15.5

Matrix products: default
BLAS:   /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.0/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] httr_1.4.2     compiler_4.0.2 selectr_0.4-2  magrittr_1.5   R6_2.4.1       tools_4.0.2   
 [7] curl_4.3       xml2_1.3.2     stringi_1.4.6  stringr_1.4.0  rvest_0.3.6   

【问题讨论】:

  • 这真的很奇怪。 x &lt;- reps 不起作用,x &lt;- dput(reps) 也不起作用。仅当您复制并粘贴 dput 并保存时它才有效。
  • @RonakShah 感谢您查看此内容并确认不只是我!
  • 这只是我的猜测,但我认为这与空格的表示方式有关。如果您查看 wikipedia 中的源代码,它使用 &amp;nbsp; 之类的东西来表示空格,我认为这不是 R 表示空格的方式。因此,当您将其与 == 进行比较时,它不匹配,使用 dput 时也是如此,但是当您手动将其复制并粘贴到 R 中时,维基百科的空白会变成 r 空白并且它可以工作。不过,这一切只是猜测,没有证据:)
  • 同意。我刚刚查看了charToRaw() 的reps$District 和"Alabama 1",它们不同。网页抓取的乐趣...
  • 你们是对的,看起来&amp;nbsp是罪魁祸首...例如,比较strsplit(reps$District, "\u00A0")和strsplit(reps$District, " ")

标签: r rvest xml2


【解决方案1】:

\u00A0 将匹配 &amp;nbsp;,因此您可以将所有这些替换为 gsub。

reps$District <- gsub("\u00A0", " ", reps$District, fixed = TRUE)

完整代码:

library(rvest)
library(xml2)
url    = "https://en.m.wikipedia.org/wiki/List_of_current_members_of_the_United_States_House_of_Representatives"
file   = xml2::read_html(url)
tables = rvest::html_nodes(file, "table")
reps = rvest::html_table(tables[6])
reps = as.data.frame(reps)[1,1:3]
reps$District <- gsub("\u00A0", " ", reps$District, fixed = TRUE)
reps$District == "Alabama 1"
# [1] TRUE

【讨论】:

  • 行得通!非常感谢。如果 rvest 有一个默认情况下自动处理此问题的选项,那将是理想的。我将在他们的 github 上打开一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 2011-03-22
  • 2021-07-11
  • 2021-06-07
相关资源
最近更新 更多