我只是从R网站中提取数据,我的脚步已经湿透了.EIA有一个网页,提供对其数据的交互式访问,我想提取可用数据的年份范围
我想提取选项的值,但仅限于网页上的特定选择元素(名为" year1")。我怎么能这样做?
<span id="sub3">
<label for="year">Start Year:</label>
<select name="year1" id="year" style="font-size:12px;padding:4px 2px;border:solid 1px #aacfe4;" onchange="activeB()">
<option value="2012">2012</option>
<option value="2011">2011</option>
<option value="2010">2010</option>
<option value="2009">2009</option>
<option value="2008" selected="selected">2008</option>
<option value="2007">2007</option>
<option value="2006">2006</option>
<option value="2005">2005</option>
<option value="2004">2004</option>
<option value="2003">2003</option>
<option value="2002">2002</option>
<option value="2001">2001</option>
<option value="2000">2000</option>
<option value="1999">1999</option>
<option value="1998">1998</option>
<option value="1997">1997</option>
<option value="1996">1996</option>
<option value="1995">1995</option>
<option value="1994">1994</option>
<option value="1993">1993</option>
<option value="1992">1992</option>
<option value="1991">1991</option>
<option value="1990">1990</option>
<option value="1989">1989</option>
<option value="1988">1988</option>
<option value="1987">1987</option>
<option value="1986">1986</option>
<option value="1985">1985</option>
<option value="1984">1984</option>
<option value="1983">1983</option>
<option value="1982">1982</option>
<option value="1981">1981</option>
<option value="1980">1980</option>
</select>
</span>
我已经下载了页面并提取了页面上的所有选项值,但我仍然试图仅提取&#34; year1&#34;选择元素。
library(XML)
webpage <- readLines("http://www.eia.gov/cfapps/ipdbproject/IEDIndex3.cfm?tid=2&pid=2&aid=12")
htmlpage <- htmlParse(webpage, asText = TRUE)
pageoptions <- xpathSApply(htmlpage, "//option", function(u) xmlAttrs(u)["value"])
给出了:
head(pageoptions)
value value value value value value
"regions" "2012" "2011" "2010" "2009" "2008"
如您所见,包含了另一个select
列表。
那么,我如何得到那些2008 - 2012年的价值,假设页面结构保持不变但可用的日期范围可能随时间而变化?
谢谢。
修改
接受的答案适用于以下代码:
year <- c(NA_integer_, NA_integer_)
startline <- grep(pattern = "XMLinclude.*syid=", x = webpage, value = FALSE)
year[1] <- sub(pattern = "^.*syid=(.*)&eyid.*", replacement = "\\1", x = webpage[startline])
year[2] <- sub(pattern = "^.*eyid=(.*)&form.*", replacement = "\\1", x = webpage[startline])
分析,内存分配存在很大差异,其中xml_func是jdharrison的解决方案,url_func是hvollmeier的解决方案,而noxml_func是我在睡觉时遇到的第三个解决方案(使用grep查找select
控件的开头,然后使用while循环迭代选项值,直到找到select
的末尾并使用gsub
拉出值:)
time alloc release dups ref src
1 0.001 0.392 0 0 .active-rstudio-document#7 wrapper_func/noxml_func
2 0.019 13.853 0 12332 .active-rstudio-document#8 wrapper_func/xml_func
3 0.001 0.000 0 129 .active-rstudio-document#9 wrapper_func/url_func
答案 0 :(得分:4)
在span[@id='sub3']
上添加其他过滤器以缩小搜索范围
library(XML)
webpage <- readLines("http://www.eia.gov/cfapps/ipdbproject/IEDIndex3.cfm?tid=2&pid=2&aid=12")
htmlpage <- htmlParse(webpage, asText = TRUE)
pageoptions <- xpathSApply(htmlpage, "//span[@id='sub3']/*/option", function(u) xmlAttrs(u)["value"])
> pageoptions
value value value value value value value value value value
"2012" "2011" "2010" "2009" "2008" "2007" "2006" "2005" "2004" "2003"
value value value value value value value value value value
"2002" "2001" "2000" "1999" "1998" "1997" "1996" "1995" "1994" "1993"
value value value value value value value value value value
"1992" "1991" "1990" "1989" "1988" "1987" "1986" "1985" "1984" "1983"
value value value
"1982" "1981" "1980"
"//select[@name='year1']/option"
因为您的xpath也可以使用
答案 1 :(得分:2)
url="http://www.eia.gov/cfapps/ipdbproject/XMLinclude_3.cfm?tid=2&pid=2&pdid=&aid=12&cid=regions&syid=2008&eyid=2012&form=&defaultid=3&typeOfUnit=STDUNIT&unit=BKWH&products="
下载文件并保存:
download.file(url,"eiafile.xls")