从R中的HTML页面中提取数据:特定选择元素中的选项值

时间:2014-06-22 09:40:34

标签: html xml r

我只是从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  

2 个答案:

答案 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)

@Tom,甚至更好,更稳定,而不是刮取页面下载数据作为excel文件,并做任何你想做的事情:-)。 (请参阅页面上的excel链接?当您检查元素时,您可以找出excel xls文件的URL)

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")