Web从纯文本到R

时间:2016-05-01 07:02:34

标签: r web-scraping plaintext

我需要在“发布名称”列下的每个包含“就业情况”的日期网页抓取http://www.bls.gov/schedule/schedule/2007/2007_sched.htm。网页报废输出应为:

Jan.  5, Feb.  2, 2007, March  9, April  6, May  4, June  1, 2007
July  6, 2007, Aug.  3, Sept.  7, Oct.  5, Nov.  2, 2007, Dec.  7  
#year can be ignored/omitted 

要为http://www.bls.gov/schedule/news_release/2015_sched.htm实现相同目的,请使用以下内容:

library(rvest)
pg <- read_html("http://www.bls.gov/schedule/news_release/2015_sched.htm")

# target only  <td> elements under bodytext div
body <- html_nodes(pg, "div#bodytext")

# use this new set of nodes and a relative XPath to get initial <td> elements, then get their siblings
es_nodes <- html_nodes(body, xpath=".//td[contains(., 'Employment Situation for')]/../td[1]")

# clean up and make dates
nfpdates <- as.Date(trimws(html_text(es_nodes)), format="%A, %B %d, %Y")

存储了nfpdates下的日期列表。我尝试调整该代码以适用于http://www.bls.gov/schedule/schedule/2007/2007_sched.htm并且失败了。问题是这两个URL以不同的格式存储信息。如果信息以纯文本而不是HTML表格存储,那么如何从该URL中提取日期?谢谢。

1 个答案:

答案 0 :(得分:1)

这不是完整的解决方案,但它会从网页中提取包含“就业情况”的请求行。您请求的文本与预标签相关联。在这个页面上有4个部分(第3和第4部分是空的)。

library(rvest)
url <- "http://www.bls.gov/schedule/schedule/2007/2007_sched.htm"
body<-html_nodes(read_html(url), "pre")
#text= xml_text(body[1])  #only uses the first table
text= sapply(1:length(body), function(i) {xml_text(body[i])})  #looks at all tables
#create one list for all the captured lines
table1<-unlist(strsplit(text, "\n"))
#find lines that match the search string
employ<-table1[grepl("The Employment Situation", table1)]

最终结果是:

  

[1]“就业形势,2006年12月1月5日上午8:30 \ r”   [2]“就业形势,2007年1月\ tFeb.2007 / t 8:30 am \ r \ n”

     

...

此时,需要使用strsplit,gsub,grep来清理并隔离每行的所需文本。 如果您仍然遇到问题可能是另一个Stackoverflow问题,重点是从每行提取日期。 祝你好运。