【问题标题】:Empty/half filled table scraping with rvest用 rvest 刮空/半满桌子
【发布时间】:2015-12-19 20:35:59
【问题描述】:

这是网站:

http://en.openei.org/apps/USURDB/rate/view/53bedfaf5257a37b15b4ba01

目标:尝试获取所有表,包括空表。

问题:我没有得到网站上的任何表格。

对于第一个表:点可以作为字符或任何其他数据类型存储在 DF 中吗?

对于第二张桌子:(使用时间需求收费结构)

shtml <-html(http://en.openei.org/apps/USURDB/rate/view/53bedfaf5257a37b15b4ba01#2__Demand, encoding = 'UTF-8')
shtml %>% 
  html_nodes('#flat_demand_strux_table') %>%
  html_table(h=TRUE,trim=FALSE,fill=TRUE)

我在收到html_Tag(x) == 'Table' 错误后尝试了html_tag 之后我得到了:

UseMethod("html_nodes","html_tables") 中的错误:没有适用于 html_nodes/html_tables 的方法...

对于这两个我都尝试了html_text,然后将其转换为数据框,但它只给出了一个大行,所有数据都在继续,例如:

Period Tier Max kVA Usage Rate $/kVA Adjustments $/kVA 11 10 36.61 Â Â 2 15 49.05 Â Â 3 20 55.47 Â Â 4 25 61.89 Â Â 5 30 67.98.

尝试了不同的编码,但没有结果。

问题出在哪里?

这是我对进一步处理的第一个要求,仅卡在这里。

【问题讨论】:

  • 您没有获得任何表格,因为没有任何&lt;table&gt;s。 很多 &lt;div&gt;s,因此html_table() 不起作用。您必须以不同的方式定位每个元素并手动构建数据框。
  • 哦!感谢您的快速和正确的响应,但是选择每个元素将是乏味的,我必须为每个网页(实用程序)循环运行它,这可能会导致大量时间/负载。还有其他选择吗?

标签: r web-scraping dataframe html-table rvest


【解决方案1】:

如果我是你,我会使用 XML 包。我仍然没有被说服转向 rvest。我从解决方案开始并不完美,但它应该可以工作。通常我使用一个名为 SelectorGadget 的 Chrome 扩展程序,然后我使用正则表达式来清理文本。如果您要访问多个 URL 但在每个页面上执行相同的操作,我建议您使用 foreach 包来循环浏览每个页面。有一个选项可以删除有错误的网址,这真的很方便

library(XML)
library(dplyr)

url <- 'http://en.openei.org/apps/USURDB/rate/view/53bedfaf5257a37b15b4ba01#2__Demand'

doc = htmlParse(url)

# - xpath taken from SelectorGadget
gg <- getNodeSet(doc, '//*[(@id = "demand_rate_strux_table")]//*[contains(concat( " ", @class, " " ), concat( " ", "strux_view_cell", " " ))]')

# - Get the values from the nodes
Values = sapply(gg, xmlValue)

# - put in table form
Table <- t(matrix(Values, nrow = 5))

# - remove paragraph breaks and 2 - 55 spaces in a row
Names <- gsub('\n|[ ]{2,55}','',Table[1,])

FinalTable <-
data.frame(
  X1 = as.numeric(gsub("Â", '0', gsub('[ ]{1,4}', '', Table[-1,1])))
  ,X2 = as.numeric(gsub("Â ", NA, Table[-1,2]))
  ,X3 = as.numeric(gsub("Â ", NA, Table[-1,3]))
  ,X4 = as.numeric(gsub("Â ", NA, Table[-1,4]))
  ,X5 = as.numeric(gsub("Â ", NA, Table[-1,5]))
) %>%
  # - Fix the period so it is tidy :)
  mutate(
    X1 = cummax(X1)
  )

# - Add in column names
colnames(FinalTable) = Names

【讨论】:

  • 哇!这确实适用于 JackStat,我也尝试使用 XML,但没有使用 getNode,因为从一开始我就认为它是一个表。
  • 我很高兴这对你有用。也许我是老派,但我使用 XML 已经有一段时间了,我喜欢这种灵活性。是否有几个相同的页面需要抓取?如果有,我建议转到包含所有链接(如果存在)的页面并将它们刮到向量中,然后您可以使用 foreach 遍历每个链接并从中构建一个大型 data.frame。刮痧快乐!
猜你喜欢
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多